sql-server-2008-r2 - SCOPE_IDENTITY 回读

标签 sql-server-2008-r2

我的系统已在 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/

相关文章:

sql-server - 如何从主数据库中删除用户定义的对象

sql - 如何更改数据库中每个表的索引

sql-server-2008-r2 - SSRS 2008 - 日期范围的多个分组

c++ - 微软 SQL 服务器 : Access a local temporary table in a prepared statement

c# - 超时已过。在操作完成之前超时期限已过,或者服务器没有响应。该语句已终止

.net - 支持 SQL Server 2005 和 2008

sql - 如何识别连续的工作日期?

sql - SQL Server 2008 R2 有没有办法避免这种循环?

sql - SQL Server 2008 R2 中重命名数据库时出错

SQL 查询根据值和字段名称从两个表中获取计数