2009-12-31 67 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(),因为您永远无法预测何时可能会添加触发器,并且您可能需要一段时间才能发现设置了错误的子关系,并且以这种方式混乱的数据几乎无法修复。

相关问题