SQL Server 2005 のコンテキストでは、主キーが一意の識別子 (GUID) であり、newid() 関数によって既定値が生成されるテーブルがあります。新しいレコードをテーブルに挿入するストアド プロシージャを作成したいと考えています。レコードの PK 値を取得するにはどうすればよいですか? ID 宣言されたフィールドの場合、これは簡単です。scope_identity() を呼び出します。ガイドをどのように進めればよいですか?
ありがとう、ルシアン
SQL Server 2005 のコンテキストでは、主キーが一意の識別子 (GUID) であり、newid() 関数によって既定値が生成されるテーブルがあります。新しいレコードをテーブルに挿入するストアド プロシージャを作成したいと考えています。レコードの PK 値を取得するにはどうすればよいですか? ID 宣言されたフィールドの場合、これは簡単です。scope_identity() を呼び出します。ガイドをどのように進めればよいですか?
ありがとう、ルシアン
挿入前に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
レコードを挿入する前に新しい Guid を生成し、この新しい Guid をレコードの PK として明示的に使用します。次に、挿入したばかりの行を参照することを知って、挿入後にその guid を使用します。
DECLARE @newGuid uniqueidentifier
SET @newGuid = newid()
INSERT INTO myTable(id, stringval)
VALUES (@newGuid, "Hello")
SELECT * FROM myTable
WHERE id = @newGuid
ストアドプロシージャで一意の識別子を作成してテーブルに挿入し、挿入が完了した後に値を返す必要があります。
CREATE PROCEDURE insNewGuidIdRow
@newId UNIQUEIDENTIFIER output,
@otherData NVARCHAR(10)
AS
BEGIN
SET @newId = NEWID()
INSERT INTO GuidIdTable(id, otherData)
VALUES (@newId, @otherData)
END
デフォルト値として新しいGUIDを作成する代わりに、挿入された値を使用するだけです。
クエリの場合:
主キー列が最初の列の場合挿入stmtの実行にはexecutescalar()を使用します。
クエリによって返された結果セットの最初の行の最初の列を返します。
プロシージャの場合:INSERT INTO tblBrowser(IDString)VALUES(@IDString)SET @ID = @@ Identityは、特に戻りパラメータとしてadoパラメータを宣言し、sprocによって返された値を受け取りますSet par = .CreateParameter( "intOutput"、 adVarChar、adParamOutput、30)。
すでにストアドプロシージャを使用している場合は、newid()を取得し、挿入を実行して、GUIDを返すことができます。
CREATE PROCEDURE Insert_myTable(@values...) AS
DECLARE @pk GUID
SET @pk = NEWID()
INSERT INTO myTable(PKID, values...) VALUES (@pk, @values...)
SELECT @pk
私のために働くこれを使用してください
DECLARE @id uniqueidentifier;
SELECT @id=NEWID()
INSERT INTO MyTable(ID,other)
VALUES(@id,'other');
SELECT
ステートメントを使用して行として返すかOUTPUT
、一度に 1 行の場合はパラメーターを使用して返すことができます。