返回自动创建的guid id的最佳方法是什么?

时间:2010-01-14 00:15:36

标签: tsql

我有一个表,主键字段(Id)

有一个newid()

在存储过程中我需要将这个新创建的guid作为返回参数返回,我可以事先创建guid并插入到数据库中,但这会破坏newid()的目的。有没有办法处理这个问题?

INSERT INTO [SUBS].[dbo].[Subscriptions]
           ([CustomerId]
           ,[SubscriptionClassId]
           ,[StartDate]
           ,[TrialAmount]
           ,[Amount]
           ,[TrialInterval]
           ,[Interval]
           ,[TrialIntervalLength]
           ,[IntervalLength]
           ,[CreatedBy]
           ,[LastUpdatedBy])
     VALUES
           (@CustomerId
           ,@SubscriptionClassId
           ,@StartDate
           ,@TrialAmount
           ,@Amount
           ,@TrialInterval
           ,@Interval
           ,@TrialIntervalLength
           ,@IntervalLength
           ,@CreatedBy
           ,@CreatedBy)

select @SubscriptionId = SCOPE_IDENTITY() -- this does not work because scope_identity is numeric

2 个答案:

答案 0 :(得分:0)

我实际上没有对此进行测试,但如果您使用的是更高版本的SQL Server,则可以使用输出语句:

DECLARE @ins TABLE (id uniqueidentifier)

INSERT INTO [SUBS].[dbo].[Subscriptions] 
           ([CustomerId] 
           ,[SubscriptionClassId] 
           ,[StartDate] 
           ,[TrialAmount] 
           ,[Amount] 
           ,[TrialInterval] 
           ,[Interval] 
           ,[TrialIntervalLength] 
           ,[IntervalLength] 
           ,[CreatedBy] 
           ,[LastUpdatedBy]) 
     OUTPUT INSERTED.id INTO @ins (id)
     VALUES 
           (@CustomerId 
           ,@SubscriptionClassId 
           ,@StartDate 
           ,@TrialAmount 
           ,@Amount 
           ,@TrialInterval 
           ,@Interval 
           ,@TrialIntervalLength 
           ,@IntervalLength 
           ,@CreatedBy 
           ,@CreatedBy) 

select @SubscriptionId = id from @ins

否则,您需要在订阅表上创建一个标识列,然后将其用作查找以选择ID。

答案 1 :(得分:0)

newid()的输出可以转换为字符串值。

使用CAST(NEWID() AS varchar(36))获取GUID字符串。