我有一个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,我应该为上述内容致电ExecuteNonQuery
或ExecuteReader
,因为它有INSERT
和SELECT
混乱...
答案 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)