web-dev-qa-db-ja.com

別のTransact SQLスクリプトを実行するTransact SQL

それぞれテーブルを作成してデータを入力する10個のトランザクションSQLスクリプトがあります。

私は、他の10個の各スクリプトを実行する1つのマスターSQLスクリプトを作成しようとしています。

Microsoft SQL Server 2008のTSQL/TRANSACTSQLを使用して、現在のtsqlスクリプト内から別のtsqlスクリプトを実行する方法はありますか?

これは、SQL Server Management Studio(SSMS)を介して実行することを目的としています。

ありがとう!

56
Steve Stedman

SSMSで.sqlファイルを実行しようとしている場合は、これを試してください。

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

注:これを実行するには、SQLコマンドモードをオンにします(クエリ> SQLCMDモード)

これらがかなり頻繁に実行するスクリプトである場合、ストアドプロシージャにドロップして、そのように実行することを検討してください。

Sqlcmdを使用して実行することもできます(より一般的だと思います)。

sqlcmd -S serverName\instanceName -i C:\Scripts\Script1.sql
92
Abe Miessler

最も簡単な方法は、スクリプトにストアドプロシージャを作成し、(EXECUTEコマンドを介して)各プロシージャを中央プロシージャから順番に呼び出すことです。これは、まったく同じスクリプトを繰り返し実行する場合(または、異なるパラメーターが渡された同じスクリプト)に理想的です。

スクリプトが.sql(または任意の種類のテキスト)ファイルである場合、@ Abe Miesllerが(追加)言っているように、SQLCMDモードが有効になっている場合、:rコマンドを介してSSMS内からスクリプトを実行できます。正確なファイルパスと名前を知ってスクリプトを作成する必要があります。これは、ストアドプロシージャ内からは実行できません。

「既知の」ファイル名で使用でき、任意のファイル名に必要な最後の代替手段(たとえば、現在サブフォルダーにロードされているすべてのファイル)は、拡張プロシージャXP_CMDSHELL。そのようなソリューションはかなり早く取得できます(ファイルのリストを取得し、xp_cmdshellを介して各ファイルのSQLCMDを呼び出す文字列を順番に作成して実行し、出力ファイルを介して結果とエラーを管理します)最後の手段としてこれを行います。

5
Philip Kelley

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
Shane Delmore

または、openrowsetを使用してスクリプトを変数に読み込んで実行します。

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

--PRINT @sql
EXEC (@sql)
5
Pesche Helfer

10個のスクリプトを個別のファイルに保持する場合、osql.exeを実行して10個のスクリプトを希望する順序で実行するバッチファイルを作成するのが最も簡単な方法です。

2
Russell McClure