2011-07-18 16 views
1

渡されたパラメータがビジネス・ルールに違反していないかどうかをチェックするコードを実行するストアド・プロシージャ(たとえばsp1)があります。検証の後、テーブルに実際にレコードを挿入する別のストアドプロシージャ(たとえばsp2)を呼び出します。SCOPE_IDENTITY - プロシージャを呼び出して別のプロシージャを呼び出して挿入する

質問SCOPE_IDENTITYsp1を使用してIDENTITYsp2に挿入することができますか?

答えて

4

SCOPE_IDENTITY()は最新のIDをスコープから提供するので、sqlが "GO"ヒットして新しいスコープが作成され、IDを受け取らないとすぐに、sp2に出力パラメータを追加してIDを受け取ることができますこれはおそらく最良の方法です。

3

Joakimによると、SCOPE_IDENTITY()は、2番目の手順からIDを返しません。 SCOPE_IDENTITY()

スコープは、ストアドプロシージャ、トリガ、関数、またはバッチのモジュールです。 したがって、同じストアドプロシージャ、ファンクション、またはバッチの場合は、2つのステートメントは同じスコープになります。

@@Identityは、あなたが望むように動作しますが、それは、トリガーを含め、現在の接続内部の最新のアイデンティティをピックアップ主要な欠点を持っていません。関連するテーブルでトリガーが動作していないことを100%確信していても、後でトリガーを追加する人はこれを打ち破り、バグを見つけるのは手間がかかりますので、出力パラメーターをいかに簡単に使うかについては、 @@Identity

+0

。 – HLGEM

+0

@HLGEM私は「それは決してないだろう」と書いたが、その点を明確にするように編集する。 –

0

可能であれば、常ににカプセル化してください。 SP2は新しいスコープのID値を返します。 SP2 新しいスコープのID値を返す必要があります。 RETURN値またはOUTパラメーターとして戻すことができます。

グローバルを避けるには常に最適です。

1

挿入を実行しているプロセスで必要なID値を保持する出力パラメータを作成します。また、scope_identitiyまたは出力節の結果を使用してそれをポピュレートします。

次にあなたが呼び出すprocの中に同じ名前の変数を作成し、このようPROCを呼び出す:あなたは@@アイデンティティを使用している場合は何のトリガーが今存在しない場合であっても、後から追加することで、これを中断します

exec @id = usp_my_proc @someinputvariable, @someotherinputvariable 
関連する問題