2012-02-21 49 views
2

我有一个SQL Server作为asp.net应用程序的后端。多人可能会在同一个表中同时插入数据...'。IDENT_CURRENT返回最后的标识值,但SCOPE_IDENTITY不

当我读这篇文章的解决方案/回答: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')

我该怎么做?

UPDATE

我的INSERT语句这是动态生成一个基类共建:

INSERT INTO TEST (NAME) VALUES (@Name) 

命令的参数集合已值“XXX”,终于雨过天青插入到表。

我不使用存储过程只是纯粹的SqlDataReader与C#。

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

我怎样才能运行上面的语句中的最后自动INC ID和我应该叫ExecuteNonQueryExecuteReader对于上述,因为它有一个INSERTSELECT这混乱...

+1

向我们展示您的插入命令。在上周的类似问题上看看我的答案,也许它是有帮助的:http://stackoverflow.com/questions/9319532/return-value-from-sql-server-insert-command-using-c-sharp/9319609 #9319609您必须在相同范围内使用scope_identity。 – 2012-02-21 20:47:28

+2

你可能完全独立地执行了这两个命令。 – 2012-02-21 20:48:10

+0

我独立执行它们。 – Pascal 2012-02-21 20:48:58

回答

4

只使用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') 

OUTPUT:

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

(1 row(s) affected) 
+0

没有必要读取变量中的最后一行id,如果它没有重用。我认为你的场景在商店程序中更有意义。但它与Scope_Identiy的工作方式相同,所以我将其标记为解决方案,尽管我不使用它;-) – Pascal 2012-02-22 20:17:53

+0

我的示例不会将标识置于变量中! “工作示例”代码创建一个变量表,所以有一个地方可以插入一行并生成一个标识。 'OUTPUT INSERTED.YourIdentity'使insert语句生成一个包含插入的标识值的结果集。此解决方案使用单个INSERT来插入数据并选择标识值。你在评论中的解决方案,使用两个命令来实现相同的目的。如果在插入中使用OUTPUT,则可以消除'; Select Scopy_Identity();'代码。 – 2012-02-22 20:35:55

+0

请注意,如果表具有插入触发器,则会发生错误。那么你需要使用'OUTPUT INTO'而不是'OUTPUT' – 2015-09-09 08:50:45

11

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

@@IDENTITY返回当前会话中任何表的最后一个标识值,跨所有范围。

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

相关问题