web-dev-qa-db-ja.com

GUIDのSCOPE_IDENTITY()?

GUIDをSQL Serverの主キーとして使用しているときにSCOPE_IDENTITY()に相当するものがあるかどうかを教えてもらえますか?

最初にGUIDを作成し、プライマリGUIDとしてシーケンシャルGUIDを使用しているため、変数として保存する必要はありません。

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

91
bplus

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

リファレンス: SQL 2005のOUTPUT句の探索

94
Rob Garrison

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();
...
56
Daniel

nEWID()を使用したい

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

    select @id

しかし、クラスター化インデックスの問題はGUIDにあります。これも読んでください NEWSEQUENTIALID() 。これらは私のアイデアです。使用前に考えてくださいGUIDas primary Key 。 :)

7
anishMarokey
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;
3
Joe

このスレッドをリソースとして使用して、トリガー内で使用する次のものを作成しました。

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;

同じことをしている他の誰かを助けるかもしれません。これが良い考えであるかどうかにかかわらず、誰かがパフォーマンスに関して賢明であると言う悪いことを持っているならば、興味があります。

1
TravisWhidden