2012-02-09 4 views
2

OUTPUT句を使用すると、おそらく新しく挿入されたレコードのIDを取得するのに最適な方法です。私はかなり私はストアドプロシージャを書くことができると呼ぶが、私のビジネスオブジェクトは動的に生成されたSQLを使用するので、ストアドプロシージャを使用することは問題になると思います。誰も私はどのように出力節で単一の入力ステートメントを実行し、返されたID値を取得するためにado.netを使用することができますか?それはちょうどこのようにすることが可能ではないように見えるが、私は尋ねると思った...ADO.NETでIDを取得するOUTPUT節の例?

編集:それは私が思ったよりも簡単だった...私はテーブルに出力する必要があると思った最初は変数。しかし、私が今やっているやり方は、新しいレコードを挿入する前にアイデンティティを戻しているので、まったくうまくいっていません。

INSERT Test (F1) 
OUTPUT SCOPE_IDENTITY() 
VALUES ('Testing') 

私はこれを行うたびに、それが最後に挿入されたレコードのアイデンティティの値が実際にあるものより1つの数字が小さい結果を私に戻っています:ここで私はちょうどでテストしていた文です。結果に1を追加するだけですが、もちろんテーブル間を移動するときには機能しません。最後の結果は別のテーブルから取得されます。

私はIDENT_CURRENT( 'Test')を使用して1を追加する必要があるのでしょうか?それは1つのトランザクションとして処理され、並行性の問題について心配する必要はないからです。

正しい結果を得るための考え方はありますか?

+0

@@ IDENTITYをストアドプロシージャの出力パラメータとして返す方法を尋ねていますが、挿入があると仮定していますか? – Candide

+0

@Ingenu私の編集を参照してください –

答えて

2

あなたのアイデンティティのフィールド名が同上ある場合は、次のように使用します。

INSERT Test (F1) 
OUTPUT INSERTED.Id 
VALUES ('Testing') 

SCOPE_IDENTITY()によって返された値がinsertと明らかにOUTPUT仕上げ

それともそれをシンプルに保つ後に変更されます:

INSERT Test (F1) 
VALUES ('Testing') 

SELECT SCOPE_IDENTITY() 

あなたはIDフィールドが何であるかを知るべきではありません。

+0

ありがとう、それは私が必ずしも名前がIdであることを知っているわけではないので、もう少し仕事だったが、やってしまった。残念ながら、私はReturnValue SqlParameterを介して値を返すのに何の問題もないと思っていましたが、私はまだそれを取得していない... –

+0

更新された答え。 –

+0

ええ、私はコードをできるだけシンプルにするために2番目の方法を避けようとしていました(そうでなければ、並行処理に問題がないことを保証するためにトランザクションでラップする必要があります)。しかし、いずれにせよ、私はINSERTEDを使うことができるように仕事をしてしまいました。私はただExecuteScalar()を使って価値を取り戻すことができます。すべては再び世界で良いです:) –