5

以前は、次のような簡単なクエリを実行して、Accessで使用される次の利用可能な自動番号を取得していました。

SELECT RecordNumber, Info 
FROM myTABLE 
WHERE 0 = 1

このようにして、currentRecordを保持する変数を作成でき、行を更新するときにAccessが使用するのと同じ自動番号を使用します。

rs.AddNew
currentRecord = rs("RecordNumber")

rsInfo = "SomeFormData" & currentRecord
rs.Update
rs.Close

現在、これはMS Accessで機能するために使用されますが、SQL Server 2005では、新しいレコードによって作成されたIDを取得できません。「SomeFormData」が正しく挿入され、SQLのRecordNumberフィールドに新しい自動番号が入力されますが、変数にRecordNumberがないため、関連するフォームにデータを保存し、関連するテーブルにデータを保存する必要があります。 currentRecord番号を保存します。

質問:新しい挿入を行うときにこの一意の番号を取り戻す方法はありますか?

4

3 に答える 3

10

IDENT_CURRENT('tableName')(一重引用符を含める) は、指定されたテーブルの ID の現在の値を返します。この値は、テーブルで使用される最後に割り当てられた ID 値である必要があります。つまり、行が削除されていない限り、この ID 値を持つ行が既にテーブルに存在します。次に割り当てられる ID 値は にINSERTなりますIDENT_CURRENT('tableName') + IDENT_INCR('tableName')

ただし、これに依存することはお勧めしません。この方法で次の ID 値を事前に決定すると、別のプロセスが実際にその ID を取得する前に別のプロセスが挿入を行うという状況に陥ることになるため、プロセスは間違った ID 値を使用してしまいます。

最初に挿入を行い (すべてのデータがまだない場合でも)、SCOPE_IDENTITY()実際の ID を割り当てるために使用する方がはるかに優れています。

なぜSCOPE_IDENTITY()が よりも優れているのか不思議に思うかもしれませんIDENT_CURRENT('tableName')。名前が示すように、前者は現在のスコープ (バッチ、ストアド プロシージャなど) 内で割り当てられた最新の ID 値を提供しますが、後者は誰によってもテーブルに割り当てられた最新の ID を提供します。IDENT_CURRENT' の直後に呼び出す可能性がありますがINSERT、他の誰かがINSERTその間に発生する可能性があり、あなたの代わりに挿入の結果IDENT_CURRENTとして得られた ID 値を提供しますが、は常にあなたのものを提供します。SCOPE_IDENTITY

編集

同様SCOPE_IDENTITY()に機能する@@IDENTITY. どちらも現在のバッチ内で割り当てられた最新の ID 値を返し@@IDENTITYますが、トリガー内で発生する挿入の影響を受けます。SCOPE_IDENTITY()ではありません。

于 2008-11-19T16:52:45.487 に答える
1

SELECT CAST(Scope_Identity() AS INT)

于 2008-11-19T16:40:31.080 に答える