2009-10-02 9 views
80

GUIDをSQL Serverのプライマリキーとして使用する場合、SCOPE_IDENTITY()に相当するものがあるかどうかは誰にでも教えてください。GUIDのSCOPE_IDENTITY()?

GUIDをまず作成して、逐次GUIDを主キーとして使用しているため、変数として保存する必要はありません。

最後に挿入されたGUID主キーを取得する最も良い方法は何ですか?

答えて

6

あなたはNEWIDを(使用する)

declare @id uniqueidentifier 
    set @id = NEWID() 
    INSERT INTO [dbo].[tbl1] 
      ([id]) 
    VALUES 
      (@id) 

    select @id 

が、クラスタ化インデックスの問題GUIDです。この1つをあまりにも読み取るNEWSEQUENTIALID()。これは私のアイデアです、GUIDを使用する前に考えるとprimary Key。 :)

+0

+1 NEWSEQUENTIALID –

+5

"newsequentialid()組み込み関数は、CREATE TABLEまたはALTER TABLEステートメントの 'uniqueidentifier'型の列のDEFAULT式でのみ使用できます。他の演算子と組み合わせることはできません複雑なスカラー表現を形成する」 –

82

OUTPUTを使用してGUIDを戻すことができます。これは、複数のレコードを挿入しているときにも機能します。

CREATE TABLE dbo.GuidPk (
    ColGuid uniqueidentifier NOT NULL DEFAULT NewSequentialID(), 
    Col2 int    NOT NULL 
) 
GO 

DECLARE @op TABLE (
    ColGuid uniqueidentifier 
) 

INSERT INTO dbo.GuidPk (
    Col2 
) 
OUTPUT inserted.ColGuid 
INTO @op 
VALUES (1) 

SELECT * FROM @op 

SELECT * FROM dbo.GuidPk 

参考:Exploring SQL 2005’s OUTPUT Clause

+1

Anishmarokeyには、NewID()ではなくGUIDを生成するためにNewSequentialID()を使用する必要があります。 –

+0

ありがとう、私はその構文についての手がかりがなかった – cmsjr

3
CREATE TABLE TestTable(KEY uniqueidentifier, ID VARCHAR(100), Name VARCHAR(100), Value tinyint); 
Declare @id uniqueidentifier ; 
DECLARE @TmpTable TABLE (KEY uniqueidentifier);  
INSERT INTO [dbo].[TestTable] 
    ([ID], [Name], Value])   
    OUTPUT INSERTED.KEY INTO @TmpTable   
    VALUES(@ID, @Name, @Value);   
SELECT @uniqueidentifier = KEY FROM @TmpTable; 
DROP TABLE TestTable; 
47

あり、主キーとしてGUIDを使用時にSCOPE_IDENTITY()と等価ではありませんが、あなたは同様の結果を得るために、OUTPUT句を使用することができます。出力のためにテーブル変数を使用する必要はありません。

CREATE TABLE dbo.GuidTest (
    GuidColumn uniqueidentifier NOT NULL DEFAULT NewSequentialID(), 
    IntColumn int NOT NULL 
) 

GO 

INSERT INTO GuidTest(IntColumn) 
OUTPUT inserted.GuidColumn 
VALUES(1) 

上記の例は、.Netクライアントから値を読み取る場合に便利です。 .Netから値を読み取るには、ExecuteScalarメソッドを使用します。リソースとしてこのスレッドを使用して

... 
string sql = "INSERT INTO GuidTest(IntColumn) OUTPUT inserted.GuidColumn VALUES(1)"; 
SqlCommand cmd = new SqlCommand(sql, conn); 
Guid guid = (Guid)cmd.ExecuteScalar(); 
... 
0

、私はトリガー内で使用するために、以下を作成しました:

DECLARE @nextId uniqueIdentifier; 
DECLARE @tempTable TABLE(theKey uniqueIdentifier NOT NULL DEFAULT NewSequentialID(), b int); 
INSERT INTO @tempTable (b) Values(@b); 
SELECT @nextId = theKey from @tempTable; 

は、他の誰かが同じことをやって助けるかもしれません。これはいいアイデアではない、あるいはそうでない場合、誰かがパフォーマンスを賢明と言うのが悪いことがあれば興味があります。

+0

質問を再読した後、私はこれが本当にユーザーの質問に答えることができないことを認識しました...しかし、同様の回答が同じタイプの応答であるため、 – TravisWhidden