Sql server 2008 r2 作用域标识读回

Sql server 2008 r2 作用域标识读回,sql-server-2008-r2,Sql Server 2008 R2,我有一个在WindowsServer2003和SQLServer2000上运行多年的系统,没有出现任何问题。最近,我将系统移动到Windows Server 2008 R2和SQL Server 2008 R2,开始出现非常奇怪的间歇性问题 我将向具有标识列的表中插入一行,并执行select以检索标识值。大多数情况下,此代码工作正常,但在随机间隔内,不会返回标识。有时找不到任何行,因此dr.Read返回false,有时返回一行,但其中没有标识列。我检查了数据库,插入成功了,只是没有返回标识。表上

我有一个在WindowsServer2003和SQLServer2000上运行多年的系统,没有出现任何问题。最近,我将系统移动到Windows Server 2008 R2和SQL Server 2008 R2,开始出现非常奇怪的间歇性问题

我将向具有标识列的表中插入一行,并执行select以检索标识值。大多数情况下,此代码工作正常,但在随机间隔内,不会返回标识。有时找不到任何行,因此
dr.Read
返回false,有时返回一行,但其中没有标识列。我检查了数据库,插入成功了,只是没有返回标识。表上没有触发器

我还尝试将SQL更改为:

INSERT INTO test (value) 
VALUES (100) 
SELECT SCOPE_IDENTITY() AS 'identity' OPTION (MAXDOP 1) 
以防我遇到了错误,但这也没有帮助

以下是相关代码(略为简化以便于说明):


如果您只是将它们作为两个单独的语句执行,会怎么样

objCommand = New SqlCommand("INSERT INTO test (value) VALUES (100); SELECT SCOPE_IDENTITY() AS 'identity'", oConn, tr)

为您提供“插入同一作用域中标识列的最后一个标识值”。

SQL Server 2008 R2上的另一个选项是使用:

这将输出插入行的
ID
,这就是您想要的标识值

如果您使用
ExecuteScalar
(而不是
ExecuteReader
),并且只需将得到的
对象
类型转换回
int

objCommand = New SqlCommand("INSERT INTO test (value) VALUES (100); SELECT SCOPE_IDENTITY() AS 'identity'", oConn, tr)
INSERT INTO test (value) 
OUTPUT INSERTED.ID
VALUES (100)