我的系统已在 Windows Server 2003 和 SQL Server 2000 上运行多年,没有出现任何问题。最近我将系统移动到 Windows Server 2008 R2 和 SQL Server 2008 R2 并开始出现非常奇怪的间歇性问题。
我将一行插入到一个带有标识列的表中,并执行选择以检索标识值。大多数情况下,这段代码工作正常,但在随机时间间隔内不会返回身份。有时找不到行,所以 dr.Read
返回 false,有时我得到一行,但其中没有标识列。我查看了数据库,插入成功了,只是没有返回身份。 table 上没有触发器。
我还尝试将 SQL 更改为:
INSERT INTO test (value)
VALUES (100)
SELECT SCOPE_IDENTITY() AS 'identity' OPTION (MAXDOP 1)
以防我遇到 'max degree of parallelism'错误,但这也没有帮助。
这里是相关代码(为便于说明略有简化):
Dim dr As SqlDataReader = Nothing
Dim objCommand As New SqlCommand
Dim oConn As New SqlConnection
Dim id as integer
oConn.ConnectionString = connStr
oConn.open()
objCommand = New SqlCommand("INSERT INTO test (value) VALUES (100) SELECT SCOPE_IDENTITY() AS 'identity'", oConn, tr)
try
dr = objCommand.ExecuteReader
If Not dr.Read Then
Throw (New Exception("Could not read IDENTITY"))
Else
id = dr("identity")
End If
Catch
Throw
Finally
If Not dr Is Nothing Then dr.Close()
oConn.close()
End Try
最佳答案
如果您只是将它们作为两个单独的语句来执行会怎样?
objCommand = New SqlCommand("INSERT INTO test (value) VALUES (100); SELECT SCOPE_IDENTITY() AS 'identity'", oConn, tr)
SCOPE_IDENTITY为您提供“在同一范围内插入标识列的最后一个标识值。”
关于sql-server-2008-r2 - SCOPE_IDENTITY 回读,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13053404/