レコードのuniqueidentifierキー値を取得します
-
19-08-2019 - |
質問
SQL Server 2005のコンテキストでは、プライマリキーがuniqueidentifier(GUID)であり、newid()関数によって生成されるデフォルト値を持つテーブルがあります。テーブルに新しいレコードを挿入するストアドプロシージャを作成したい。レコードのPK値を取得するにはどうすればよいですか? ID宣言されたフィールドの場合、これは簡単です-scope_identity()を呼び出します。 GUIDを使用するにはどうすればよいですか
ありがとう、 ルシアン
解決
レコードを挿入する前に新しいGUIDを生成し、この新しいGUIDをレコードのPKとして明示的に使用します。次に、挿入した行を参照していることを確認して、挿入後にそのGUIDを使用します。例:
DECLARE @newGuid uniqueidentifier
SET @newGuid = newid()
INSERT INTO myTable(id, stringval)
VALUES (@newGuid, "Hello")
SELECT * FROM myTable
WHERE id = @newGuid
他のヒント
挿入前にGUIDを生成すると、インデックスの断片化が発生します。
GUIDを事前に挿入する必要はありません。
お勧めします:
-
NEWSEQUENTIALIDデフォルト制約を使用して、連続するGUIDを生成します。 (これにより、インデックスの断片化が解消されます-主キーとしてのGUIDの既知の問題)。
-
新しいOUTPUT句(SQL Server 2005の新機能)を使用すると、新しく挿入されたGUIDを取得できます。
下の例:
DECLARE @outputTblCustomer1 TABLE (CustomerID uniqueidentifier)
-- Customer1
INSERT INTO dbo.Customer1 (CustomerNumber, LastName) OUTPUT INSERTED.CustomerID INTO @outputTblCustomer1 VALUES (-1, N'LastName')
SELECT CustomerID FROM @outputTblCustomer1
-- Customer3
INSERT INTO dbo.Customer3 (CustomerNumber, LastName) VALUES (-1, N'LastName')
SELECT SCOPE_IDENTITY() AS CustomerID
ストアドプロシージャで一意の識別子を作成してテーブルに挿入し、挿入が完了した後に値を返す必要があります。
CREATE PROCEDURE insNewGuidIdRow
@newId UNIQUEIDENTIFIER output,
@otherData NVARCHAR(10)
AS
BEGIN
SET @newId = NEWID()
INSERT INTO GuidIdTable(id, otherData)
VALUES (@newId, @otherData)
END
新しいGUIDをデフォルト値として作成する代わりに、挿入された値を使用します。
SELECT
ステートメントを使用して行として返すか、一度に1行の場合はOUTPUT
パラメーターを使用できます。
既にストアドプロシージャを使用している場合は、newid()を取得し、挿入を実行して、guidを返すことができます。
CREATE PROCEDURE Insert_myTable(@values...) AS
DECLARE @pk GUID
SET @pk = NEWID()
INSERT INTO myTable(PKID, values...) VALUES (@pk, @values...)
SELECT @pk
クエリの場合:
主キー列が最初の列の場合、挿入stmt ...の実行にexecutecalar()を使用します
クエリによって返される結果セットの最初の行の最初の列を返します。
手順: INSERT INTO tblBrowser(IDString)VALUES(@IDString) SET @ID = @@ Identity ADOパラメータを特に宣言します パラメータを返すと、sprocによって返された値を受け取ります par = .CreateParameter(<!> quot; intOutput <!> quot ;, adVarChar、adParamOutput、30)を設定します。
次のようなテーブル:
CREATE TABLE [dbo].[TableName ](
[Code] [uniqueidentifier] ROWGUIDCOL NOT NULL,
[Name] [nvarchar](100) NOT NULL)
ALTER TABLE [dbo].[TableName ] ADD CONSTRAINT [DF_Questionnaire_Code] DEFAULT (newid()) FOR [Code]
そして、次のようなSQLの挿入:
INSERT INTO TableName (Name)
OUTPUT Inserted.Code AS NewGUID
VALUES ('TEST')
出力として新しいGUIDを取得します。
NewGUID
------------------------------------
F540C0F8-ADBC-4054-BAB6-1927DE59FA99
自分に合った機能を使用してください
DECLARE @id uniqueidentifier;
SELECT @id=NEWID()
INSERT INTO MyTable(ID,other)
VALUES(@id,'other');