在SQL Server 2005的上下文中,我有一个表,其主键是uniqueidentifier(GUID),具有newid()函数生成的默认值。我想编写一个存储过程,将新记录插入表中。我如何获得记录的PK值?对于身份声明字段,这很容易 - 我称之为scope_identity()。我该如何处理guids?
谢谢, 卢西恩
答案 0 :(得分:4)
在插入之前生成GUID会引入索引碎片。
无需在插入之前声明GUID,
我建议:
使用NEWSEQUENTIALID默认约束生成连续的Guids。 (这将消除索引碎片 - 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
答案 1 :(得分: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
答案 2 :(得分:1)
您必须在存储过程中创建唯一标识符并将其插入表中,然后在插入完成后返回值。
CREATE PROCEDURE insNewGuidIdRow
@newId UNIQUEIDENTIFIER output,
@otherData NVARCHAR(10)
AS
BEGIN
SET @newId = NEWID()
INSERT INTO GuidIdTable(id, otherData)
VALUES (@newId, @otherData)
END
它只使用inserted值而不是创建一个新的guid作为默认值。
答案 3 :(得分:0)
您可以使用SELECT
语句将其作为行返回,或者如果一次只有一行,则使用OUTPUT
参数。
答案 4 :(得分: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
答案 5 :(得分:0)
查询:
如果主键列是第一列使用executioncalar()执行insert stmt ...
它将返回查询返回的结果集中第一行的第一列。
程序: INSERT INTO tblBrowser(IDString)VALUES(@IDString) SET @ID = @@ Identity 特别声明一个ado paramater 返回参数,它将接收由sproc返回的值 设置par = .CreateParameter(“intOutput”,adVarChar,adParamOutput,30)。
答案 6 :(得分: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 Like:
INSERT INTO TableName (Name)
OUTPUT Inserted.Code AS NewGUID
VALUES ('TEST')
您将获得NEW GUID作为输出:
NewGUID
------------------------------------
F540C0F8-ADBC-4054-BAB6-1927DE59FA99
答案 7 :(得分:0)
使用适用于我的
DECLARE @id uniqueidentifier;
SELECT @id=NEWID()
INSERT INTO MyTable(ID,other)
VALUES(@id,'other');