在 SQL Server 2005 的上下文中,我有一个表,其主键是唯一标识符 (GUID),默认值由 newid() 函数生成。我想编写一个将新记录插入表中的存储过程。如何获取记录的PK值?对于身份声明的字段,这很容易——我调用 scope_identity()。我应该如何继续使用指南?
谢谢,卢锡安
在 SQL Server 2005 的上下文中,我有一个表,其主键是唯一标识符 (GUID),默认值由 newid() 函数生成。我想编写一个将新记录插入表中的存储过程。如何获取记录的PK值?对于身份声明的字段,这很容易——我调用 scope_identity()。我应该如何继续使用指南?
谢谢,卢锡安
在插入之前生成 GUID 会引入索引碎片。
无需在插入前声明 GUID,
我会推荐:
使用 NEWSEQUENTIALID 默认约束生成连续的 Guid。(这将消除索引碎片——Guids 作为主键的一个众所周知的问题)。
使用新的 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 作为默认值。
您可以使用SELECT
语句将其作为行返回,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
对于查询:
如果您的主键列是第一列使用 executescalar() 执行您的插入 stmt...
它将返回查询返回的结果集中第一行的第一列。
对于过程: INSERT INTO tblBrowser (IDString) VALUES (@IDString) SET @ID = @@Identity 声明一个 ado 参数专门作为返回参数,它将接收 sproc 返回的值 Set par = .CreateParameter("intOutput", 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');