8

私はthis question挿入された行のアイデンティティを取得について読んだことがあります。私の質問は一種の関連です。挿入された行のPKガイドを取得する最善の方法

挿入された行のGUIDを取得する方法はありますか?私が作業しているテーブルは、主キー(newidにデフォルト設定されている)としてGUIDがあり、その行を挿入した後にGUIDを取得したいと考えています。

Guidsには@@IDENTITY,IDENT_CURRENTまたはSCOPE_IDENTITYのようなものがありますか?

答えて

12

OUTPUT機能を使用して、デフォルト値をパラメータに戻すことができます。

CREATE TABLE MyTable 
(
    MyPK UNIQUEIDENTIFIER DEFAULT NEWID(), 
    MyColumn1 NVARCHAR(100), 
    MyColumn2 NVARCHAR(100) 
) 

DECLARE @myNewPKTable TABLE (myNewPK UNIQUEIDENTIFIER) 

INSERT INTO 
    MyTable 
(
    MyColumn1, 
    MyColumn2 
) 
OUTPUT INSERTED.MyPK INTO @myNewPKTable 
VALUES 
(
    'MyValue1', 
    'MyValue2' 
) 

SELECT * FROM @myNewPKTable 

私は、プライマリキーとして一意の識別子を使用することに注意してください。 GUIDのインデックス作成は、新しく生成されたGUIDがインデックスの途中に挿入され、最後に追加されるだけなので、パフォーマンスが非常に悪いです。 NewSequentialId()のSQL2005には新機能があります。あなたのガイドであいまいさが必要ない場合は、可能な代替方法です。

+0

こんにちは、感謝を挿入した場合。このコードは、 "テーブル変数" @myNewPK "を宣言する必要があります。あなたはテーブルにしか出力できないようです。私はそれが一時テーブルを宣言し、テーブルからIDを選択することによって働いている。あなたの助けを借りて、そしてGuidsの貧弱なパフォーマンスに関するアドバイスをありがとう。 –

+0

申し訳ありませんが、私はそれをテストしていなかった、ちょうど私が思い出したものから一緒にそれを投げていた。テーブル変数を返すように答えを更新しました。 –

+0

非常にいいです、ありがとうRobin。受け入れられました:) –

1

別のクリーナーアプローチ、助言のための単一の行

CREATE TABLE MyTable 
(
    MyPK UNIQUEIDENTIFIER DEFAULT NEWID(), 
    MyColumn1 NVARCHAR(100), 
    MyColumn2 NVARCHAR(100) 
) 

DECLARE @MyID UNIQUEIDENTIFIER; 
SET @MyID = NEWID(); 

INSERT INTO 
    MyTable 
(
    MyPK 
    MyColumn1, 
    MyColumn2 
) 
VALUES 
(
    @MyID, 
    'MyValue1', 
    'MyValue2' 
) 

SELECT @MyID; 
関連する問題