检索记录的唯一标识键值。

3
在SQL Server 2005的上下文中,我有一张表,其主键是唯一标识符(GUID),默认值由newid()函数生成。我想编写一个存储过程将新记录插入到表中。如何获取记录的PK值?对于声明了identity字段的情况,这很容易 - 我调用scope_identity()。那么我该如何处理GUID呢?
谢谢, Lucian
8个回答

4
在插入之前生成GUID会引起索引碎片化。
在插入时不需要声明GUID,
我建议:
1. 使用NEWSEQUENTIALID默认约束生成连续的Guids。(这将消除Guid作为主键时已知的索引碎片化问题)。
2. 使用新的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

1
好观点 - 但仅当PK被索引时才是真的。在SQL Server中,表上的聚集索引默认情况下是在PK上的,但如果表的使用需要,这显然可以移动到另一列。 - Paul Nearney

3

在插入记录之前,我会生成一个新的Guid,并明确使用这个新的Guid作为记录的主键。然后,在插入后使用该guid,知道它指向刚刚插入的行,例如:

DECLARE @newGuid uniqueidentifier
SET @newGuid = newid()

INSERT INTO myTable(id, stringval)
VALUES (@newGuid, "Hello")

SELECT * FROM myTable
WHERE id = @newGuid

实际上,客户端能够选择主键的能力是使用GUID的主要优势之一,依我看。 - Jon Skeet

1

您需要在存储过程中创建唯一标识符并将其插入表中,然后在插入完成后返回该值。

CREATE PROCEDURE insNewGuidIdRow 
    @newId  UNIQUEIDENTIFIER output,
    @otherData  NVARCHAR(10)
AS
BEGIN
    SET @newId = NEWID()

    INSERT INTO GuidIdTable(id, otherData)
    VALUES (@newId, @otherData)
END

它将仅使用插入的值,而不是创建一个新的guid作为默认值。


0

带有如下表格:

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

0

如果是一行数据,您可以使用SELECT语句返回它,或者使用OUTPUT参数。


0

关于查询:

如果您的主键列是第一列,请使用executescalar()来执行插入语句...

它将返回查询返回结果集中第一行的第一列。

对于存储过程: INSERT INTO tblBrowser (IDString) VALUES (@IDString) SET @ID = @@Identity 声明一个ADO参数,具体作为返回参数,并且它将接收存储过程返回的值。 设置par = .CreateParameter("intOutput", adVarChar, adParamOutput, 30)。


0
如果您已经在一个存储过程中,那么可以检索 newid(),执行插入操作,并返回 guid。
CREATE PROCEDURE Insert_myTable(@values...) AS

DECLARE @pk GUID
SET @pk = NEWID()

INSERT INTO myTable(PKID, values...) VALUES (@pk, @values...)

SELECT @pk

0

使用这个对我有效

  DECLARE @id uniqueidentifier;
  SELECT @id=NEWID()    
  INSERT INTO MyTable(ID,other)
  VALUES(@id,'other');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接