是"BEGIN trans "需要得到正确的SCOPE_IDENTITY

本文关键字:quot SCOPE IDENTITY trans BEGIN | 更新日期: 2023-09-27 18:18:02

我使用的是这样的SqlCommand:

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

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

我先试过了,当然,它工作得很好。但是,即使有两个同时插入,它也能正常工作吗?(我不知道如何测试)

是"BEGIN trans "需要得到正确的SCOPE_IDENTITY

你不需要BEGIN TRANScope_Identity()没有它也能正常工作。即使有"同时插入"。这就是这个函数的全部意义——只返回当前作用域的答案。

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

也有OUTPUT子句在SQL 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

不完全是你的问题的答案,但如果你是在SQL Server 2005及以上版本,考虑使用OUTPUT子句,看看这个完整的示例答案,这是足够简单的实现

INSERT dbo.MyTable (col1, col2, col3)
OUTPUT INSERTED.idCol
VALUES ('a', 'b', 'c')

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