6

以下を使用していくつかのSQLファイルを呼び出します。

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

:r私はここからの呼び出しについてこの考えを持っています: TransactSQL to run another TransactSQL script . スクリプトには、そのコードなどに他のScript1.sqlSQL スクリプト呼び出しが含まれている場合もあります。

しかし、今は各スクリプトの設定を定義したいと考えています。例:の呼び出しの直前にLastInsertedIDの値を定義して設定します。そして、このスクリプトはこの変数を使用して動作します。SCOPE_IDENTITY()Script1.sql

そのために、sqlcmd スクリプト変数 ( http://msdn.microsoft.com/de-de/library/ms188714.aspx ) を使用し、次を使用して設定していました。

:setvar LastInsertedID SCOPE_IDENTITY()

次に、に書き込むSELECT $(LastInsertedIDScript1.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適切に使用するか、または目的の出力でこの問題を別の方法で解決するにはどうすればよいですか?

助けや意見をいただければ幸いです。

4

2 に答える 2

2

sqlcmd ディレクティブ (例: :setvar) は、サーバーとまったく通信しません。それらを基本的なマクロと考えてください。それらは、実行時にわかることを変更するためのものです。sqlcmd でステートメントのファイルを出力し、それを sqlcmd の別の呼び出しで読み込むという手の込んだ方法を思いつくことができると思いますが:setvar、それは非常に面倒で壊れやすいようです。何を達成しようとしていますか?

于 2013-07-11T01:45:53.540 に答える