2010-01-14 106 views
0

我有一个表,有一个newid()为主键字段(Id)返回一个自动创建的GUID ID的最佳方式是什么?

在存储过程我需要返回这个新创建的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 

回答

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。

0

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

使用CAST(NEWID() AS varchar(36))得到一个GUID字符串。

相关问题