2

我正在使用SqlCommand这样的:

command.CommandText = "INSERT INTO ... VALUES ...; SELECT SCOPE_IDENTITY();";

这足够了吗,还是我需要BEGIN TRAN等等?(这里提到过。)

当然,我首先尝试了它,并且效果很好。但是即使有两个同时插入,它也能正常工作吗?(而且我不确定如何测试。)

4

3 回答 3

5

你不需要BEGIN TRANScope_Identity()没有它就可以正常工作。即使有“同时插入”。这就是函数的全部意义——仅返回当前范围的答案。

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

SQL Server 2005 及更高版本中还有该OUTPUT子句,这是另一种返回有关您的数据的方法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
于 2013-06-12T22:29:45.350 回答
2

不完全是您问题的答案,但如果您使用的是 SQL Server 2005 及更高版本,请考虑使用OUTPUT子句,看看这个完整示例的答案,它很容易实现

INSERT dbo.MyTable (col1, col2, col3)
OUTPUT INSERTED.idCol
VALUES ('a', 'b', 'c')
于 2013-06-12T23:03:10.850 回答
1

Scope_Identity 和 Begin Tran 独立工作,当您可能希望在查询中的给定点回滚或提交事务时使用 begin tran。

于 2013-06-12T22:39:45.347 回答