2009-09-01 14 views
17

私は、自動増分に設定された主キーを持っています。テーブルに挿入してプライマリキーの値を取得するにはどうすればよいですか?

複数のクエリを実行中で、別のテーブル(IsIdentity = TRUE)の外部キーとして使用するためにプライマリキーの値を取得する必要があります。

挿入クエリを実行したときにプライマリキーの値を取得する方法はありますか。今、私は再クエリーして、本当にハッキリと思われるそのコラムで最高の価値を得ています。

提案がありますか?

答えて

25
insert into YourTable values (...) 

SCOPE_IDENTITYと新しいPK()

select scope_identity() 
+1

+1うんですが()に行くための最も信頼性の高い効率的な方法です! –

+0

これは最善の方法です。 – HLGEM

+0

@HLGEMそれでは何ですか? – paz

2

神聖ながらくたを取得します!!!

だけSCOPE_IDENTITY()関数を呼び出す:

insert into your_talble(col1,col2) values('blah','more blah') 
select scope_identity() 

他の文が挿入を行う場合は、最も高い値を選択すると、エラーが返されますので。 scope_identity()は、現在のコンテキスト(ステートメントによる)で作成されたIDを返します。

4

SCOPE_IDENTITY()はおそらくあなたが望むものです。これは、実行される同じコードコンテキストによって挿入された最後のレコードのIDを返します。

IDENT_CURRENT( 'tablename')は並行性の問題の影響を受けます。つまり、INSERTとIDENT_CURRENTの呼び出しの間に別のレコードが挿入されないという保証はありません。

私は、VillageIdiotの爆発が参照している驚きの源が何であるかはわかりませんが、私はこの質問がまったく重複しているようには思われません。

+0

を使用すると、dupとしてフラグが立てられず、最初に見つけました! – htm11h

31

SQL Server 2005以降を使用している場合は、OUTPUT句を使用できます。

create table T(
    pk int identity primary key, 
    dat varchar(20) 
); 
go 

insert into T 
output inserted.pk 
values ('new item'); 
go 

drop table T; 

出力は、テーブルだけでなくクライアントにも送信できます。例:

create table T(
    pk int identity primary key, 
    dat varchar(20) 
); 

create table U(
    i int identity(1001,1) primary key, 
    T_pk int not null, 
    d datetime 
); 
go 


insert into T 
output inserted.pk, getdate() 
into U(T_pk,d) 
values ('new item'), ('newer item'); 
go 

select * from T; 
select * from U; 
go 

drop table T, U; 

SQL Server 2008以降では、より多くの可能性について「構成可能なDML」を使用できます。

+1

もう1つの非常に良いアプローチです.PKがアイデンティティではない場合でも機能します.-良いコール –

+0

2ではなく役に立つ2つのステートメントです – gbn

+0

+1:ここで新しい何かを学びました – van

2

scope_identity()を使用する必要があります。そして、insert文とscope_identity()をトランザクションにラップすることをお勧めします。

6
INSERT INTO YourTable (1, 2, etc.) 
OUTPUT inserted.yourIDcolumn 
VALUES (value1, value2, value...) 

注:これは、SCOPE_IDENTITYを使用して、MS SQL 2005と大きい

関連する問題