テーブルに新しいレコードを挿入したときに、新しく作成されたIDを取得したい。
http://msdn.microsoft.com/en-us/library/ms177564.aspx、一時テーブルを作成する必要があります。
INSERT文を実行した後にIDを返したい(INSERTを1回だけ実行したと仮定して)。
例
1 Joe Joe
2 Michael Mike
3 Zoe Zoe
INSERT文を実行するとき、作成されたID、つまり4を返したい。
SQLステートメントを使用してそれを行う方法を教えてください。
SQL Server テーブルに INT IDENTITY
型 (または BIGINT IDENTITY
型) のカラムがある場合は、次のようにして最新の挿入値を取得できます:
INSERT INTO dbo.YourTable(columns....)
VALUES(..........)
SELECT SCOPE_IDENTITY()
このスコープで最後に渡された IDENTITY
値を返すだけです。
これらのオプションがどのように動作し、どのように異なるのか(そして予期せぬ結果をもたらす可能性があるのか)については、こちらのPinal Daveによる素晴らしいブログ記事を参照してください。
単純なテーブルを想定した場合:
CREATE TABLE dbo.foo(ID INT IDENTITY(1,1), name SYSNAME);
IDENTITY`の値をテーブル変数に取り込んで、さらに利用することができる。
DECLARE @IDs TABLE(ID INT);
-- minor change to INSERT statement; add an OUTPUT clause:
INSERT dbo.foo(name)
OUTPUT inserted.ID INTO @IDs(ID)
SELECT N'Fred'
UNION ALL
SELECT N'Bob';
SELECT ID FROM @IDs;
このメソッドの良い点は、(a) 複数行の挿入を処理できること(SCOPE_IDENTITY()
は最後の値しか返しません)、(b) この並列処理のバグを回避できることです。
使うことができる:
SELECT IDENT_CURRENT(‘tablename’)
を使用すると、特定のテーブルの最新の ID にアクセスできます。
例えば、以下のコードを考えてみましょう:
INSERT INTO dbo.MyTable(columns....) VALUES(..........)
INSERT INTO dbo.YourTable(columns....) VALUES(..........)
SELECT IDENT_CURRENT(‘MyTable’)
SELECT IDENT_CURRENT(‘YourTable’)
これは、対応するテーブルの正しい値になります。
これは、値を生成した接続や、値を生成した文のスコープに関係なく、テーブルで最後に生成された IDENTITY
値を返します。
IDENT_CURRENTはスコープやセッションの制限を受けません。IDENT_CURRENT
は、セッションやスコープに関係なく、特定のテーブルに対して生成された ID 値を返す。