在SQL Server 2005的上下文中,我有一张表,其主键是唯一标识符(GUID),默认值由newid()函数生成。我想编写一个存储过程将新记录插入到表中。如何获取记录的PK值?对于声明了identity字段的情况,这很容易 - 我调用scope_identity()。那么我该如何处理GUID呢?
谢谢, Lucian
谢谢, Lucian
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作为记录的主键。然后,在插入后使用该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作为默认值。
带有如下表格:
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
如果是一行数据,您可以使用SELECT
语句返回它,或者使用OUTPUT
参数。
关于查询:
如果您的主键列是第一列,请使用executescalar()来执行插入语句...
它将返回查询返回结果集中第一行的第一列。
对于存储过程: INSERT INTO tblBrowser (IDString) VALUES (@IDString) SET @ID = @@Identity 声明一个ADO参数,具体作为返回参数,并且它将接收存储过程返回的值。 设置par = .CreateParameter("intOutput", adVarChar, adParamOutput, 30)。
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');