В 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 миллисекунды.
Создайте пакетный файл со сценарием (извините о форматировании, но это, действительно должно быть встроено для выполнения пакета):
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 файле через пакетный файл
:) можно заметить, продержаться два, от ТАК!
Я хотел сделать то же самое короткое время назад, и я закончил тем, что делал его путем создания маленького vbscript.
Посмотрите здесь Управление исходным кодом и хранимые процедуры
Я использовал 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
Существует альтернатива в Studio управления SQL Server, пишущий сценарий базы данных...
Разверните представление Object Explorer, чтобы найти базу данных, щелкнуть правой кнопкой и выбрать "Задачи: Генерируйте Сценарии"
Оттуда можно написать сценарий всего объекта, просто сохранил preocedures, чего-либо промежуточного. На одной странице существует довольно много опций, хотя основной, который я изменяю: - "Включают, ЕСЛИ НЕ СУЩЕСТВУЕТ"
Путем создания той опции "FALSE" затем Вы просто получаете целый список операторов CREATE.
Можно затем принять решение написать сценарий объектов к новому окну запроса или файла.
Я добавил 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"