私は、自動増分に設定された主キーを持っています。テーブルに挿入してプライマリキーの値を取得するにはどうすればよいですか?
複数のクエリを実行中で、別のテーブル(IsIdentity = TRUE
)の外部キーとして使用するためにプライマリキーの値を取得する必要があります。
挿入クエリを実行したときにプライマリキーの値を取得する方法はありますか。今、私は再クエリーして、本当にハッキリと思われるそのコラムで最高の価値を得ています。
提案がありますか?
私は、自動増分に設定された主キーを持っています。テーブルに挿入してプライマリキーの値を取得するにはどうすればよいですか?
複数のクエリを実行中で、別のテーブル(IsIdentity = TRUE
)の外部キーとして使用するためにプライマリキーの値を取得する必要があります。
挿入クエリを実行したときにプライマリキーの値を取得する方法はありますか。今、私は再クエリーして、本当にハッキリと思われるそのコラムで最高の価値を得ています。
提案がありますか?
insert into YourTable values (...)
SCOPE_IDENTITYと新しいPK()
select scope_identity()
神聖ながらくたを取得します!!!
だけSCOPE_IDENTITY()
関数を呼び出す:
insert into your_talble(col1,col2) values('blah','more blah')
select scope_identity()
他の文が挿入を行う場合は、最も高い値を選択すると、エラーが返されますので。 scope_identity()
は、現在のコンテキスト(ステートメントによる)で作成されたIDを返します。
SCOPE_IDENTITY()はおそらくあなたが望むものです。これは、実行される同じコードコンテキストによって挿入された最後のレコードのIDを返します。
IDENT_CURRENT( 'tablename')は並行性の問題の影響を受けます。つまり、INSERTとIDENT_CURRENTの呼び出しの間に別のレコードが挿入されないという保証はありません。
私は、VillageIdiotの爆発が参照している驚きの源が何であるかはわかりませんが、私はこの質問がまったく重複しているようには思われません。
を使用すると、dupとしてフラグが立てられず、最初に見つけました! – htm11h
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」を使用できます。
scope_identity()を使用する必要があります。そして、insert文とscope_identity()をトランザクションにラップすることをお勧めします。
INSERT INTO YourTable (1, 2, etc.)
OUTPUT inserted.yourIDcolumn
VALUES (value1, value2, value...)
注:これは、SCOPE_IDENTITYを使用して、MS SQL 2005と大きい
+1うんですが()に行くための最も信頼性の高い効率的な方法です! –
これは最善の方法です。 – HLGEM
@HLGEMそれでは何ですか? – paz