как сохраняют хранимые процедуры SQL в .sql файлы через пакет

В bash 5 вы можете получить микросекундную точность из EPOCHREALTIME. Однако сам по себе printf не имеет никакого доступа к нему напрямую, поэтому вам нужно извлечь микросекунды самостоятельно.

$ echo $EPOCHREALTIME; printf '%(%F:%T)T.%d\n' "$EPOCHSECONDS" "${EPOCHREALTIME#*.}"; echo $EPOCHREALTIME
1554006709.936990
2019-03-31:00:31:49.937048
1554006709.937083

Это занимает немного времени, но результат представляется точным примерно до 0,05 миллисекунды.

9
задан Sander de Jong 26 April 2016 в 14:35
поделиться

5 ответов

Создайте пакетный файл со сценарием (извините о форматировании, но это, действительно должно быть встроено для выполнения пакета):

osql -U %1 -P %2 -S %3 -d %4 -h-1 -Q "SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.Routines WHERE ROUTINE_TYPE = 'PROCEDURE'" -n -o "sp_list.txt"
for /f %%a in (sp_list.txt) do osql -U %1 -P %2 -S %3 -d %4 -h-1 -Q "SELECT ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.Routines WHERE ROUTINE_NAME = '%%a'" -n -o "%%a.sql"

Назовите это "run.bat". Теперь, для выполнения пакета используют параметрические усилители:
run.bat [имя пользователя] [пароль] [имя сервера] [база данных]
на примере:
Ведущее устройство run.bat sa pwd111 localhost\SQLEXPRESS
сначала все названия хранимой процедуры будут сохранены в файле sp_list.txt, затем один за другим в отдельных файлах сценария. Единственная проблема - длится строку каждого сценария с количеством результата - я работаю' над ним :)

отредактированный: ошибка в запросе исправлена

Удаление "Строк влияло" на строку
Хорошо, теперь мы должны создать еще один пакет:

type %1 | findstr /V /i %2  > xxxtmpfile 
copy xxxtmpfile %1 /y /v
del xxxtmpfile

Назовите это "line_del.bat". Посмотрите, первый параметрический усилитель является файлом для обработки, 2-й - строка для поиска строк удаление. Теперь измените основной пакет (снова, извините о форматировании):

osql -U %1 -P %2 -S %3 -d %4 -h-1 -Q "SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.Routines WHERE ROUTINE_TYPE = 'PROCEDURE'" -n -o "sp_list.txt"
call line_del sp_list.txt "rows affected"
call line_del sp_list.txt "row affected"
for /f %%a in (sp_list.txt) do osql -U %1 -P %2 -S %3 -d %4 -h-1 -Q "SELECT ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.Routines WHERE ROUTINE_NAME = '%%a'" -n -o "%%a.sql" 
for /f %%a in (sp_list.txt) do call line_del %%a.sql "rows affected"
for /f %%a in (sp_list.txt) do call line_del %%a.sql "row affected"

См. похожие статьи:
Простое программирование управляет в пакетной среде
Утилита osql
MSSQL: Как Вы пишете сценарий создания Хранимой процедуры с кодом?
Удалите определенные строки в txt файле через пакетный файл

:) можно заметить, продержаться два, от ТАК!

5
ответ дан 4 December 2019 в 22:30
поделиться

Я хотел сделать то же самое короткое время назад, и я закончил тем, что делал его путем создания маленького vbscript.

Посмотрите здесь Управление исходным кодом и хранимые процедуры

0
ответ дан 4 December 2019 в 22:30
поделиться

Я использовал sqlcmd и-E вместо пользователя, передачи. Это хорошо работает до сих пор, просто хранимые процедуры, дольше, чем 4 000 символов будут иметь разрыв строки

sqlcmd -E -S SERVER -d DB -h-1 -Q "SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.Routines WHERE ROUTINE_TYPE = 'PROCEDURE'" -o "sp_list.txt"
call line_del sp_list.txt "rows affected"
call line_del sp_list.txt "row affected"
for /f %%a in (sp_list.txt) do sqlcmd -E -S SERVER -d DB -h-1 -Q "SELECT text from dbo.syscomments WHERE id = OBJECT_ID('%%a')" -o "%%a.sql"
for /f %%a in (sp_list.txt) do call line_del %%a.sql "rows affected"
for /f %%a in (sp_list.txt) do call line_del %%a.sql "row affected"

наилучшие пожелания sean

0
ответ дан 4 December 2019 в 22:30
поделиться

Существует альтернатива в Studio управления SQL Server, пишущий сценарий базы данных...

Разверните представление Object Explorer, чтобы найти базу данных, щелкнуть правой кнопкой и выбрать "Задачи: Генерируйте Сценарии"

Оттуда можно написать сценарий всего объекта, просто сохранил preocedures, чего-либо промежуточного. На одной странице существует довольно много опций, хотя основной, который я изменяю: - "Включают, ЕСЛИ НЕ СУЩЕСТВУЕТ"

Путем создания той опции "FALSE" затем Вы просто получаете целый список операторов CREATE.

Можно затем принять решение написать сценарий объектов к новому окну запроса или файла.

2
ответ дан 4 December 2019 в 22:30
поделиться

Я добавил SET NOCOUNT ON, чтобы исключить необходимость в line_del.bat. Также заменил syscomments на sys.sql_modules (SQL 2005). Я мог бы также использовать функцию OBJECT_DEFINITION, но она была медленнее, чем sys.sql_modules.

sqlcmd -E -S SERVER -d DB -h-1 -Q "SET NOCOUNT ON SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.Routines WHERE ROUTINE_TYPE = 'PROCEDURE'" -o "sp_list.txt" for /f %%a in (sp_list.txt) do sqlcmd -E -S SERVER -d DB -h-1 -Q "SET NOCOUNT ON SELECT definition from sys.sql_modules WHERE object_id = OBJECT_ID('%%a')" -o "%%a.sql"
0
ответ дан 4 December 2019 в 22:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: