2010-01-14 50 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字符串。

相關問題