SCOPE_IDENTITY()
SQL Serverで主キーとしてGUIDを使用する場合と同等の機能があるかどうか、誰か教えてもらえますか?
主キーとしてシーケンシャルGUIDを使用しているため、最初にGUIDを作成し、変数として保存する必要はありません。
最後に挿入されたGUID主キーを取得するための最良の方法について何か考えはありますか?
SCOPE_IDENTITY()
SQL Serverで主キーとしてGUIDを使用する場合と同等の機能があるかどうか、誰か教えてもらえますか?
主キーとしてシーケンシャルGUIDを使用しているため、最初にGUIDを作成し、変数として保存する必要はありません。
最後に挿入されたGUID主キーを取得するための最良の方法について何か考えはありますか?
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
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();
...
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;
このスレッドをリソースとして使用して、トリガー内で使用するために次のものを作成しました。
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;
他の誰かが同じことをしているのを助けるかもしれません。これが良い考えではないかどうかにかかわらず、誰かがパフォーマンスに関して何か悪いことを言っているなら興味があります。