2009-12-31 85 views
0

代碼我可以使用SQL @@ identity和沒有觸發器嗎?

ALTER PROCEDURE [dbo].[spSocial.QuestionsAddNew] 
    @IdUser    int, 
    @IdQuestionCategory  int, 
    @Title     int, 
    @Body     int, 
    @CreatedDate   int, 
    @ActivityDate   int, 
    @VotesCount    int, 
    @AnswersCount   int, 
    @ViewedCount   int 
AS 
BEGIN 
    SET NOCOUNT ON; 

    insert into 
     tblSocialQuestions 
     (IdUser, IdQuestionCategory, Title, Body, CreatedDate, ActivityDate, VotesCount, AnswersCount, ViewedCount) 
    values 
     (@IdUser, @IdQuestionCategory, @Title, @Body, @CreatedDate, @ActivityDate, @VotesCount, @AnswersCount, @ViewedCount) 

    select @@IDENTITY 

    exec [spSocial.Questions2Users] @IdUser, 'AskedCount', 1 

END 

據我瞭解

的@@ IDENTITY函數返回同一 會話中創建的 最後一個標識。

會話是數據庫 連接。範圍是當前的 查詢或當前的存儲過程。

如果會話是當前數據庫連接,那麼在ASP .NET用戶請求的多線程環境中使用@@ Identity時沒有問題嗎?

如果10位用戶同時添加一個新問題,並且[spSocial.QuestionsAddNew] 存儲過程在具有相同SqlConnection的多線程環境中執行,使用@@ Identity時沒有問題嗎?

回答

2

一個ADO.NET連接只能一次執行一個命令。在幾乎所有情況下,不同的ASP.NET線程都會有不同的連接,它們在單個頁面請求期間保持不變。但即使ASP.NET線程以某種方式共享一個連接,他們也必須以這樣的方式使用連接:一次只有一個線程可以使用它,否則ADO.NET會產生錯誤。

所以不,在多線程ASP.NET環境中使用@@IDENTITY沒有任何危險。

順便說一句,最好不要使用@@IDENTITY;改爲使用SCOPE_IDENTITY()。後者也可以在某人在桌面上添加觸發器後生效。

+0

實際上,它是'SCOPE_IDENTITY()'沒有領先的@@ – 2009-12-31 12:24:24

+0

@marc_s:是的,在答案中編輯 – Andomar 2009-12-31 12:34:04

0

我想更好地使用範圍身份,而不是身份

select scope_identity() 
的@@
0

我不確定2005是否有它,但如果是這樣,輸出子句是最好的方法。如果不使用scope_identity(),因爲您永遠無法預測何時可能會添加觸發器,並且您可能需要一段時間才能發現設置了錯誤的子關係,並且以這種方式混亂的數據幾乎無法修復。

相關問題