IDENT_CURRENT返回最后一个标识值,但SCOPE_IDENTITY不返回

时间:2012-02-21 20:37:23

标签: sql-server scope-identity

我有一个SQL Server作为asp.net应用程序的后端。多人可能同时在同一个表中插入数据......'。

当我从这篇文章中读到解决方案/答案时:scope_identity vs ident_current

然后我不应该使用Ident_current,因为我可以获得另一个用户的插入ID。

但是使用Select Scope_Identity();会返回NULL,而Select IDENT_CURRENT('tableName')会返回我使用SQL Server Management Studio检查的正确ID。

我在SqlTransaction中执行的插入语句。交易后Select IDENT_CURRENT('tableName')完成。

我错了什么?

更新

我的insert语句由基类动态构建:

INSERT INTO TEST (NAME) VALUES (@Name)

命令的参数集合的值为“xxx”,所有内容都可以很好地插入到表中。

我不使用纯粹SqlDataReader和C#的存储过程。

commandText = "INSERT INTO TEST (NAME) VALUES ('Test1');Select Scopy_Identity();"

如何获取运行上述语句的上一个自动运行ID,我应该为上述内容致电ExecuteNonQueryExecuteReader,因为它有INSERTSELECT混乱...

2 个答案:

答案 0 :(得分:14)

IDENT_CURRENT返回在任何会话和任何范围内为特定表生成的最后一个标识值。

@@IDENTITY返回在所有范围内为当前会话中的任何表生成的最后一个标识值。

SCOPE_IDENTITY返回为当前会话中的任何表和当前范围生成的最后一个标识值。

答案 1 :(得分:5)

只需使用OUTPUT Clause (Transact-SQL),您就可以插入数据并在同一语句中选择所有(甚至多个)身份:

INSERT INTO TEST (NAME) OUTPUT INSERTED.YourIdentity VALUES (@Name)

工作示例:

DECLARE @YourTable table (YourIdentity int identity(1,1) primary key, YourCol1 varchar(5))

INSERT INTO @YourTable (YourCol1) OUTPUT INSERTED.YourIdentity VALUES ('ABC')

输出:

YourIdentity
------------
1

(1 row(s) affected)