GUIDをSQL Serverのプライマリキーとして使用する場合、SCOPE_IDENTITY()
に相当するものがあるかどうかは誰にでも教えてください。GUIDのSCOPE_IDENTITY()?
GUIDをまず作成して、逐次GUIDを主キーとして使用しているため、変数として保存する必要はありません。
最後に挿入されたGUID主キーを取得する最も良い方法は何ですか?
GUIDをSQL Serverのプライマリキーとして使用する場合、SCOPE_IDENTITY()
に相当するものがあるかどうかは誰にでも教えてください。GUIDのSCOPE_IDENTITY()?
GUIDをまず作成して、逐次GUIDを主キーとして使用しているため、変数として保存する必要はありません。
最後に挿入されたGUID主キーを取得する最も良い方法は何ですか?
あなたはNEWIDを(使用する)
declare @id uniqueidentifier
set @id = NEWID()
INSERT INTO [dbo].[tbl1]
([id])
VALUES
(@id)
select @id
が、クラスタ化インデックスの問題GUIDです。この1つをあまりにも読み取るNEWSEQUENTIALID()。これは私のアイデアです、GUIDを使用する前に考えるとprimary Key。 :)
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
Anishmarokeyには、NewID()ではなくGUIDを生成するためにNewSequentialID()を使用する必要があります。 –
ありがとう、私はその構文についての手がかりがなかった – cmsjr
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;
あり、主キーとして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();
...
、私はトリガー内で使用するために、以下を作成しました:
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;
は、他の誰かが同じことをやって助けるかもしれません。これはいいアイデアではない、あるいはそうでない場合、誰かがパフォーマンスを賢明と言うのが悪いことがあれば興味があります。
質問を再読した後、私はこれが本当にユーザーの質問に答えることができないことを認識しました...しかし、同様の回答が同じタイプの応答であるため、 – TravisWhidden
+1 NEWSEQUENTIALID –
"newsequentialid()組み込み関数は、CREATE TABLEまたはALTER TABLEステートメントの 'uniqueidentifier'型の列のDEFAULT式でのみ使用できます。他の演算子と組み合わせることはできません複雑なスカラー表現を形成する」 –