TransactSQL для запуска другого TransactSQL script
У меня есть 10 транзакционных SQL-скриптов, каждый из которых создает таблицу и заполняет ее данными.
Я пытаюсь создать 1 мастер sql script, который будет запускать каждый из 10 других скриптов.
Есть ли способ с TSQL/TRANSACTSQL для Microsoft SQL Server 2008 выполнить другой tsql script из текущего tsql script?
Это предназначено для запуска через SQL Server Management Studio (SSMS).
Спасибо!
Ответы
Ответ 1
Попробуйте это, если вы пытаетесь выполнить .sql файл в SSMS:
:r C:\Scripts\Script1.sql
:r C:\Scripts\Script2.sql
:r C:\Scripts\Script3.sql
...
Если это скрипты, которые вы запускаете довольно часто, вы можете подумать о том, чтобы удалить их в сохраненный proc и запустить их таким образом...
Вы также можете сделать это через sqlcmd (что я считаю более распространенным):
sqlcmd -S serverName\instanceName -i C:\Scripts\Script1.sql
Ответ 2
Самый простой способ - сделать ваши скрипты хранимыми процедурами и вызвать (через команду EXECUTE
) каждую процедуру, в свою очередь, из центральной процедуры. Это идеально, если вы снова и снова будете запускать те же самые script (s) (или те же script с разными параметрами).
Если ваши сценарии являются файлом .sql(или любым текстовым), как @Abe Miesller говорит (upvoted), вы можете запускать их из SSMS с помощью команды: r, когда включен режим SQLCMD. Вы должны знать и script точный путь и имя файла. Это невозможно сделать из хранимой процедуры.
Последняя альтернатива, используемая с "известными" именами файлов и необходимая для произвольных имен файлов (скажем, для всех файлов, загружаемых во всю подпапку), заключается в использовании мощности расширенной процедуры XP_CMDSHELL
. Такие решения могут получить compelx довольно быстро (использовать его для извлечения списка файлов, сборки и выполнения через xp_cmdshell строки, вызывающей SQLCMD для каждого файла, в свою очередь, управления результатами и ошибками с помощью выходных файлов, он продолжается и продолжается), поэтому я бы только сделайте это в крайнем случае.
Ответ 3
Вы можете использовать osql или лучше, но новый sqlcmd почти взаимозаменяем. Я использую osql в этом примере только потому, что мне приходилось иметь образец кода, сидящий, но в производстве я использую sqlcmd. Вот фрагмент кода из большей процедуры, которую я использую для запуска сценариев обновления для баз данных. Они упорядочены по мажорным, второстепенным, выпускам, строят, как я называю свои сценарии, используя это соглашение для отслеживания выпусков. Очевидно, что вам не хватает всей моей обработки ошибок, частей, где я вытаскиваю доступные скрипты из базы данных, настройки переменных и т.д., Но вы все равно можете найти этот фрагмент полезным.
Основная часть, которая мне нравится в использовании osql или sqlcmd, заключается в том, что вы можете запускать этот код в ssms или в хранимой процедуре (возможно, по расписанию) или из командного файла. Очень гибкий.
--Use cursor to run upgrade scripts
DECLARE OSQL_cursor CURSOR
READ_ONLY
FOR SELECT FileName
FROM #Scripts
ORDER BY Major, Minor, Release, Build
OPEN OSQL_cursor
FETCH NEXT FROM OSQL_cursor INTO @name
WHILE (@@fetch_status <> -1)
BEGIN
IF ((@@fetch_status <> -2) AND (@result = 0))
BEGIN
SET @CommandString = 'osql -S ' + @@ServerName + ' -E -n -b -d ' + @DbName + ' -i "' + @Dir + @name + '"'
EXEC @result = master.dbo.xp_cmdshell @CommandString, NO_OUTPUT
IF (@result = 0)
BEGIN
SET @Seconds = DATEDIFF(s, @LastTime, GETDATE())
SET @Minutes = @Seconds / 60
SET @Seconds = @Seconds - (@Minutes * 60)
PRINT 'Successfully applied ' + @name + ' in ' + cast(@Minutes as varchar)
+ ' minutes ' + cast(@Seconds as varchar) + ' seconds.'
SET @LastTime = GETDATE()
END
ELSE
BEGIN
SET @errMessage = 'Error applying ' + @name + '! The database is in an unknown state and the schema may not match the version.'
SET @errMessage = @errMessage + char(13) + 'To find the error restore the database to version ' + @StartingVersion
SET @errMessage = @errMessage + ', set @UpToVersion = the last version successfully applied, then run ' + @name
SET @errMessage = @errMessage + ' manually in Query Analyzer.'
END
IF @name = (@UpToVersion + '.sql')
GOTO CleanUpCursor --Quit if the final script specified has been run.
END
FETCH ENDT FROM OSQL_cursor INTO @name
END
Ответ 4
Предполагая, что вы хотите сохранить 10 скриптов в своих отдельных файлах, я бы сказал, что самый простой способ сделать то, что вы хотите, - создать командный файл, который выполняет osql.exe, чтобы выполнить 10 скриптов в том порядке, в котором вы хотите.
Ответ 5
Или просто используйте openrowset для чтения вашего script в переменную и выполните ее:
DECLARE @SQL varchar(MAX)
SELECT @SQL = BulkColumn
FROM OPENROWSET
( BULK 'MeinPfad\MeinSkript.sql'
, SINGLE_BLOB ) AS MYTABLE
--PRINT @sql
EXEC (@sql)