Подтвердить что ты не робот

TransactSQL для запуска другого TransactSQL script

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

Я пытаюсь создать 1 мастер sql script, который будет запускать каждый из 10 других скриптов.

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

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

Спасибо!

4b9b3361

Ответ 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)