0

重複の可能性:
scope_identityではなく@@identityを使用する理由

ユーザーがテーブルにレコードを追加するときに、挿入後のページで使用されるそのレコードのIDを返したいと思います。私は現在このコマンドを使用しています(例を参照):

INSERT INTO tCRnames (fname, lname) VALUES ('Super','Man')
DECLARE @Id INT;
SET @Id = SCOPE_IDENTITY();
SELECT @Id;

この方法に関して2つの質問があります。

  1. このコマンドはセッションに関連していますか?つまり、2人のユーザーがまったく同時にレコードを挿入した場合、返されたIDに問題が発生しますか?

  2. 挿入されたIDを返すより良い方法はありますか?現在、私のIDはすべて通常のIDフィールドですが、これで問題ありません。ただし、一部のサービスに変更を加えて、IDフィールドではないIDフィールドを残すことを検討しています。

次に、「TMP001-05」または単に「000004」などの生成されたIDを取得します。

挿入されたIDをその挿入から返すにはどうすればよいですか(生成時に返す以外に)?

4

5 に答える 5

1
  1. scope_identity() はセッション用です
  2. IDを操作/作成するものがある場合は、トリガー後にIDを取得するOUTPUT句を使用します
于 2012-10-08T10:00:48.227 に答える
0

あなたがやっている方法が「最良の」方法であり、この現在のトランザクションからINSERTed 行の ID を返すことは私の理解です。

于 2012-10-08T09:58:43.757 に答える
0

http://msdn.microsoft.com/en-us/library/ms190315.aspxのドキュメントを参照してください。

SCOPE_IDENTITYと @@IDENTITYは、現在のセッションの任意のテーブルで生成された最後の ID 値を返します。ただし、SCOPE_IDENTITYは現在のスコープ内にのみ挿入された値を返します。@@IDENTITY は特定のスコープに限定されません。

于 2012-10-08T09:58:55.420 に答える
0

現在のセッション+現在のステートメントに関連しています

于 2012-10-08T10:00:23.250 に答える
0
  1. 値はセッションに対してローカルであるため、異なるユーザーが同時にレコードを追加しても問題ありません。

  2. ID が自動的に生成されない場合は、自分で作成するので、その値にしがみつくのが最も簡単です。outputRichardTheKiwi が提案したように、挿入されたレコードから値を取得するために使用することもできます。

于 2012-10-08T10:04:56.250 に答える