是否需要"BEGIN TRAN"才能获得正确的SCOPE_IDENTITY?

isp*_*iro 2 .net c# sql sql-server sql-server-2012

我正在使用SqlCommand这样的:

command.CommandText = "INSERT INTO ... VALUES ...; SELECT SCOPE_IDENTITY();";
Run Code Online (Sandbox Code Playgroud)

这样就够了,还是我需要BEGIN TRAN等等?(这里提到.)

当然,我先尝试过,它运行正常.但即使有两个同时插入,它还能正常工作吗?(而且我不确定如何测试.)

Eri*_*ikE 5

你不需要BEGIN TRAN.Scope_Identity()没有它,功能很好.即使有"同时插入".这是函数的重点 - 仅返回当前范围的答案.

请注意,在不到SQL Server 2012的情况下,并行性可能会中断Scope_Identity(),因此如果您希望它在100%的时间内正常工作,则必须WITH (MAXDOP 1)INSERT语句中使用查询提示.您可以在Microsoft Connect上阅读有关此问题的信息.(理论上,它在SQL Server 2008 R2 Service Pack 1的累积更新包5中得到修复,但有些人似乎认为可能不是100%真实).

OUTPUTSQL Server 2005及更高版本中还有一个子句,它是INSERT通过向客户端发送行集或输出到表来返回有关您的数据的另一种方法.请注意,接收行集实际上并未证明INSERT已正确提交...因此您应该SET XACT_ABORT ON;在存储过程中使用.这是一个例子OUTPUT:

CREATE TABLE @AInsert(IDColumn);

INSERT dbo.TableA (OtherColumn) -- not the identity column
OUTPUT Inserted.IDColumn -- , Inserted.OtherColumn, Inserted.ColumnWithDefault
   INTO @AInsert
SELECT 'abc';

-- Do something with @AInsert, which contains all the `IDColumn` values
-- that were inserted into the table. You can insert all columns, too,
-- as shown in the comments above
Run Code Online (Sandbox Code Playgroud)