TransactSQL для запуска другого сценария TransactSQL - PullRequest
56 голосов
/ 08 марта 2011

У меня есть 10 транзакционных SQL-сценариев, каждый из которых создает таблицу и заполняет ее данными.

Я пытаюсь создать 1 главный SQL-сценарий, который будет запускать каждый из 10 других сценариев.

Есть ли способ с помощью TSQL / TRANSACTSQL для Microsoft SQL Server 2008 выполнить другой сценарий tsql из текущего сценария tsql?

Это предназначено для запуска через SQL Server Management Studio (SSMS).

Спасибо!

Ответы [ 5 ]

92 голосов
/ 08 марта 2011

Попробуйте, если вы пытаетесь выполнить файл .sql в SSMS:

:r C:\Scripts\Script1.sql
:r C:\Scripts\Script2.sql
:r C:\Scripts\Script3.sql
...

примечание: для этого включите командный режим sql (Query> SQLCMD Mode)

Если это скрипты, которые вы запускаете довольно часто, вы можете подумать о том, чтобы удалить их из хранимого процесса и запустить их таким образом ...

Вы также можете сделать это через sqlcmd (что, я считаю, более распространено):

sqlcmd -S serverName\instanceName -i C:\Scripts\Script1.sql
5 голосов
/ 06 декабря 2016

Или просто используйте openrowset, чтобы прочитать ваш скрипт в переменную и выполнить его:

DECLARE @SQL varchar(MAX)
SELECT @SQL = BulkColumn
FROM OPENROWSET
    (   BULK 'MeinPfad\MeinSkript.sql'
    ,   SINGLE_BLOB ) AS MYTABLE

--PRINT @sql
EXEC (@sql)
5 голосов
/ 08 марта 2011

Вы можете использовать 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
5 голосов
/ 08 марта 2011

Простейшим способом было бы сделать ваши скрипты хранимыми процедурами и вызывать (с помощью команды EXECUTE) каждую процедуру по очереди из центральной процедуры.Это идеально, если вы собираетесь запускать один и тот же сценарий снова и снова (или один и тот же сценарий с переданными различными параметрами).

Если ваши сценарии .sql (или любой другойтекстовый файл, как говорит @Abe Miesller (с голосом выше), вы можете запустить их из SSMS с помощью команды: r, когда включен режим SQLCMD.Вы должны будете знать и записать точный путь и имя файла.Это нельзя сделать из хранимой процедуры.

Последняя альтернатива, используемая с «известными» именами файлов и необходимая для произвольных имен файлов (скажем, всех файлов, загруженных в данный момент в подпапке), заключается в использовании возможностейрасширенная процедура XP_CMDSHELL.Такие решения могут довольно быстро получить Compelx (использовать его для извлечения списка файлов, создавать и выполнять через xp_cmdshell строку, вызывающую SQLCMD для каждого файла по очереди, управлять результатами и ошибками через выходные файлы, это продолжается и продолжается), поэтому я бы толькосделать это в крайнем случае.

2 голосов
/ 08 марта 2011

Предполагая, что вы хотите сохранить 10 сценариев в своих отдельных файлах, я бы сказал, что самый простой способ сделать то, что вы хотите, - создать пакетный файл, который запускает osql.exe для выполнения 10 сценариев в нужном вам порядке..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...