我有一个SQL Server作为asp.net应用程序的后端。多个人可能在"同一时间…"在同一个表中插入数据。
当我读到这篇文章的解决方案/答案时:scope_identity vs identit_current
然后我不应该使用Ident_current
,因为我可以获得另一个用户的插入id。
但是使用Select Scope_Identity();
会返回NULL,而Select IDENT_CURRENT('tableName')
会返回我在SQLServerManagementStudio中检查过的正确id。
我在SqlTransaction
中执行的插入语句。Select IDENT_CURRENT('tableName')
在事务之后完成。
我做错了什么?
更新:
我的插入语句是由一个基类动态构建在一起的:
INSERT INTO TEST (NAME) VALUES (@Name)
命令的Parameter集合的值为"xxx",所有内容都可以很好地插入到表中。
我不使用存储过程,只使用带有C#的纯SqlDataReader
。
commandText = "INSERT INTO TEST (NAME) VALUES ('Test1');Select Scopy_Identity();"
我如何获得运行上述语句的最后一个auto-inc-id?我应该为上述语句调用ExecuteNonQuery
或ExecuteReader
,因为它有一个令人困惑的INSERT
和SELECT
。。。
IDENT_CURRENT
返回在任何会话和范围中为特定表生成的最后一个标识值。
@@IDENTITY
返回为当前会话中所有作用域中的任何表生成的最后一个标识值。
SCOPE_IDENTITY
返回为当前会话和当前作用域中的任何表生成的最后一个标识值。
只需使用OUTPUT子句(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)