以下を使用していくつかのSQLファイルを呼び出します。
:r C:\Scripts\Script1.sql
:r C:\Scripts\Script2.sql
:r C:\Scripts\Script3.sql
:r
私はここからの呼び出しについてこの考えを持っています: TransactSQL to run another TransactSQL script . スクリプトには、そのコードなどに他のScript1.sql
SQL スクリプト呼び出しが含まれている場合もあります。
しかし、今は各スクリプトの設定を定義したいと考えています。例:の呼び出しの直前にLastInsertedID
の値を定義して設定します。そして、このスクリプトはこの変数を使用して動作します。SCOPE_IDENTITY()
Script1.sql
そのために、sqlcmd スクリプト変数 ( http://msdn.microsoft.com/de-de/library/ms188714.aspx ) を使用し、次を使用して設定していました。
:setvar LastInsertedID SCOPE_IDENTITY()
次に、に書き込むSELECT $(LastInsertedID
とScript1.sql
、正しい値が得られます。
INSERT
後で、選択$(LastInsertedID)
する前に他のステートメントを処理すると、新しく挿入された行の ID が得られるため、これはまったく正しくないことがわかりました。これは:setvar
、その現在の値を保存せずSCOPE_IDENTITY()
、さらにそれへの参照を保存し、要求されたときに再度呼び出すためです。
そこで、別のことを試して変数を宣言し、現在の値を割り当ててから、 でSCOPE_IDENTITY()
保存しました:setvar
。それは次のように見えました:
DECLARE @LastInsertedID int
SELECT @LastInsertedID = SCOPE_IDENTITY()
:setvar LastInsertedID @LastInsertedID
PRINT $(LastInsertedID)
これもしばらくは機能し、正しい結果が得られました。しかし、コードを複数のセクションに分割したところ、目的の出力が得られないGO
ことに気付きました。:setvar
前の例のGO
後にa を挿入すると、次のようになります。:setvar
DECLARE @LastInsertedID int
SELECT @LastInsertedID = SCOPE_IDENTITY()
:setvar LastInsertedID @LastInsertedID
GO
PRINT $(LastInsertedID)
次のようなエラー メッセージが表示されるようになりましたMust declare the scalar variable @LastInsertedID
。
ここでも:setvar
、変数の実際の値は保存されません@LastInsertedID
が、さらに変数自体への参照が保存されます。もちろん、その特定のコンテキストにはもう存在しません。
私の質問は、どのように:setvar
適切に使用するか、または目的の出力でこの問題を別の方法で解決するにはどうすればよいですか?
助けや意見をいただければ幸いです。