2011-11-22 47 views
2

我有這樣一段代碼在存儲過程:SQL Server的瞭解SCOPE_IDENTITY()

BEGIN 
    SET @UserId = NULL; 
    IF (@Username IS NOT NULL) 
    BEGIN 
     EXECUTE SP_ADD_USER @Username, @UserId OUTPUT; 
    END 
    EXECUTE SP_ADD_ALERT @Name, @AlertType, @AlertId OUTPUT; 
    INSERT INTO AlertLogs (Datastamp, AlertID, UserID, NotificationMessage) 
     VALUES (@Datastamp, @AlertId, @UserId, @EmailMessage); 
    SET @AlertLogId = SCOPE_IDENTITY(); 
END 

@AlertLogId是我想被分配給AlertLogs表的最後插入的結果的輸出參數。我必須包括

INSERT INTO AlertLogs (Datastamp, AlertID, UserID, NotificationMessage) 
     VALUES (@Datastamp, @AlertId, @UserId, @EmailMessage); 
形成新的塊(一個新的開始/結束範圍)

爲了SCOPE_IDENTITY()正常工作? (而不是例如在報告完成SP_ADD_ALERT例如插入記錄的最後一個ID?)

回答

6

在您的查詢,SCOPE_IDENTITY()是要最後輸入的標識值返回到數據庫中,這個範圍。

在這種情況下,這將是AlertLogs表身份,如果有一個身份。

作用域是一個模塊:存儲過程,觸發器,函數或批處理。 因此,兩個語句是在同一範圍內,如果它們在相同 存儲過程,函數,或批次。

http://msdn.microsoft.com/en-us/library/ms190315.aspx

+0

這是我所期待的也。 EXECUTE SP_ADD_ALERT執行另一個範圍,這樣就不會在任何情況下可以考慮,即使有也插入標識值 – Ghita

+0

是的,它在MSDN網站上的那兩條語句必須在同一存儲過程中,功能等。雖然我狀態不明白你爲什麼會在一個函數中使用'SCOPE_IDENTITY'因爲你不能'INSERT'或'EXEC' – Curt

+0

一個可以做任何事情,將導致觸發插入的東西,如果是的話,是否會影響插入的值函數中的SCOPE_IDENTITY()? –

1

你也可以在你的INSERT語句使用OUTPUT clause。這意味着您不必擔心範圍,並且可以從插入的表格中提供其他(非身份)信息。

考慮一個簡單的表格:

CREATE TABLE [dbo].[SampleTable](
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [InsertDate] [datetime] NOT NULL, 
    [Name] [nvarchar](100) NULL 
) ON [PRIMARY] 

有了這個默認添加:

ALTER TABLE [dbo].[SampleTable] 
    ADD CONSTRAINT [DF_SampleTable_Inserted] 
     DEFAULT (getdate()) FOR [InsertDate] 

你可以值缺省值和從插入操作的身份。

DECLARE @InsertedDetails TABLE (ID int, InsertDate DateTime); 

INSERT INTO SampleTable ([Name]) 
    OUTPUT inserted.ID, inserted.InsertDate 
     INTO @InsertedDetails 
    VALUES ('Fred'); 

DECLARE @ID int; 
DECLARE @InsertDate datetime; 
SELECT @ID = ID, @InsertDate = InsertDate FROM @InsertedDetails; 

PRINT @ID; 
PRINT @InsertDate; 

這裏我剛拉出來的值表變量,並打印了出來。

+0

也是一種檢索默認信息的好方法。很好! – Ghita