4

ストアドプロシージャから最後に挿入された行のIDを返そうとしています。ストアドプロシージャから最後に挿入された行のIDを返す

私のコードの簡略版は次のようになります。私は、エンタープライズライブラリ4.1にスカラを実行を通じて、このストアドプロシージャを呼び出しています

CREATE PROCEDURE [sp_name] 
    @AuthorisationCode uniqueidentifier 
AS 
    INSERT INTO [tablename] 
      ([AuthorisationCode] 
      ) 
    VALUES 
      (@AuthorisationCode 
      ) 

RETURN @@IDENTITY 

GO 

nullを返します。誰でも私が間違っていることを見ている。

+0

これ以外にも、sp_接頭辞を付けてprocsに名前を付けるのは最善の方法です。しかし、多分それはとにかく擬似コードです。 –

+0

@マーク、ありがとう、良いキャッチがありますが、ちょうどpsuedocodeです。 –

+0

**返品**値は通常、エラー処理のために予約されています(例えば、0以外の場合はエラーがあったことを意味します)。 – Brad

答えて

13

私はあなたが@@identityとしてSCOPE_IDENTITY()を使用しなければならないと言うだろうあなたの保存されないことがある(挿入された最後のIDを返します。複数の照会が同時に実行されている場合)

また、それを返すのではなく選択する必要があります。

ExecuteScalarは、結果セットの最初の行から最初の列の値を返します。

そう...

SELECT SCOPE_IDENTITY(); 

は、おそらくより多くのあなたが望むものです。

+0

+1です – Brad

0

あなたはあなたではなく、リターンより選択使用する必要がありますが、あなたはまた、IDENTITYが特定の範囲に限定されるものではなく、@@、返される間違ったアイデンティティの問題を防ぐためにSCOPE_IDENTITYを使用する必要がありますselect @@identity

+2

私はあなたにdownvoteしたくないですが、実際には '@@ identity 'の代わりに' SCOPE_IDENTITY'を使うべきです(MrEyesの答えを参照してください)。 – Brad

+0

@@ identityはおそらくこの場合は問題ありません。現在のアイデンティティ、スコープのアイデンティティーと@@アイデンティティの違いを理解することは重要ですが、@@アイデンティティは必ずしも間違っているとは限りません。重大ではない理由のために、挿入時にアイデンティティを変更し、最後に挿入されたアイデンティティを知りたいと思うトリガーがあればどうでしょうか?それから@@ identityが必要となり、scope_identityは動作しません。 –

+0

はいBrad、それは本当です、scope_identityを使用してここでより良い選択です。 (まあ、より良い選択ではなく、あなたの必要に応じて推測する)。 Althouhg、私の答えは、私は "リターン"の使用法を指していた。そして、ここではダウンボーティングが正しい選択です。これは2つの重要な違いです。 – futile

7

を使用する必要があります。

SELECT SCOPE_IDENTITY() 

詳しい情報はここで見つけることができます:

http://msdn.microsoft.com/en-us/library/ms190315.aspx

+0

+1 +1回以上投票することができます。これは、ExecuteScalarの説明のために、そのように不十分に利用されているキーワード – Brad