100

SCOPE_IDENTITY()SQL Serverで主キーとしてGUIDを使用する場合と同等の機能があるかどうか、誰か教えてもらえますか?

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

最後に挿入されたGUID主キーを取得するための最良の方法について何か考えはありますか?

4

5 に答える 5

103

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 句の調査

于 2009-10-02T16:15:37.033 に答える
65

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();
...
于 2011-12-06T10:11:22.883 に答える
4
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;
于 2011-07-27T08:57:50.030 に答える
2

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

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;

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

于 2013-12-31T23:50:23.330 に答える