3

在 SQL Server 2005 的上下文中,我有一个表,其主键是唯一标识符 (GUID),默认值由 newid() 函数生成。我想编写一个将新记录插入表中的存储过程。如何获取记录的PK值?对于身份声明的字段,这很容易——我调用 scope_identity()。我应该如何继续使用指南?

谢谢,卢锡安

4

8 回答 8

4

在插入之前生成 GUID 会引入索引碎片。

无需在插入前声明 GUID,

我会推荐:

  1. 使用 NEWSEQUENTIALID 默认约束生成连续的 Guid。(这将消除索引碎片——Guids 作为主键的一个众所周知的问题)。

  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
于 2008-12-04T09:03:53.510 回答
3

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

DECLARE @newGuid uniqueidentifier
SET @newGuid = newid()

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

SELECT * FROM myTable
WHERE id = @newGuid
于 2008-12-04T08:43:47.310 回答
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 作为默认值。

于 2008-12-04T08:55:46.757 回答
0

您可以使用SELECT语句将其作为行返回,OUTPUT如果一次是一行,则可以使用参数。

于 2008-12-04T08:46:13.047 回答
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
于 2008-12-04T08:48:39.033 回答
0

对于查询:

如果您的主键列是第一列使用 executescalar() 执行您的插入 stmt...

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

对于过程: INSERT INTO tblBrowser (IDString) VALUES (@IDString) SET @ID = @@Identity 声明一个 ado 参数专门作为返回参数,它将接收 sproc 返回的值 Set par = .CreateParameter("intOutput", adVarChar,adParamOutput,30)。

于 2008-12-04T08:57:20.247 回答
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
于 2010-03-07T19:44:38.177 回答
0

使用对我有用的这个

  DECLARE @id uniqueidentifier;
  SELECT @id=NEWID()    
  INSERT INTO MyTable(ID,other)
  VALUES(@id,'other');
于 2013-03-23T13:38:22.497 回答