症状
使用函数或SCOPE_IDENTITY () @@IDENTITY检索插入到标识 列中的值时,可能会注意到这些函数有时返回错误值。 只有当查询使用并行执行计划时,该问题才出现。 若要详细了解如何确定查询是否将使用并行执行计划,请参阅以下有关 Microsoft 下载的技术文章中的查询内并行性部分:
原因
Microsoft 已确认这是本文开头列出的 Microsoft 产品中的问题。
解决方法
累积更新信息
SQL Server 2008 R2 Service Pack 1
此问题的修补程序首次在 2008 R2 Service Pack 1 SQL Server累积更新 5 中发布。 若要详细了解如何获取此累积更新包,请单击以下文章编号,查看 Microsoft 知识库中的文章:
26596942008 R2 Service Pack 1 SQL Server更新包 5
备注 由于内部版本是累积的,因此每个新的修补程序版本都包含以前的 SQL Server 2008 R2 修补程序版本中包含的所有修补程序和所有安全修补程序。 我们建议你考虑应用包含此修补程序的最新修补程序版本。 有关更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
25676162008 SQL Server 2008 R2 Service Pack 1 SQL Server发布的 2008 R2 内部版本
解决方法
当涉及并行计划时,Microsoft 建议在查询中不要使用这些函数之一,因为它们并不总是可靠。 而是使用 INSERT 语句的 OUTPUT 子句检索标识值,如以下示例所示。
使用 OUTPUT 子句的示例:
DECLARE @MyNewIdentityValues 表 (myidvalues int)
声明@A表 (ID int 主键
)
插入 @A 值 (1)
声明@B id (id int 主键标识 (1,1) ,B int not null
)
插入到 @B 值 (1)
选择
[RowCount] = @@RowCount,
[@@IDENTITY] = @@IDENTITY,
[SCOPE_IDENTITY] = SCOPE_IDENTITY ()
在 上设置统计信息配置文件
插入到_ddr_T
输出 inserted.ID 到@MyNewIdentityValues
选择
b.ID
从 @A a
左联接 @B b on b.ID = 1
左侧联接@B b2 上的 b2。B = -1
t.T 上_ddr_T左联接 t = -1
如果不存在 (请选择 t2 _ddr_T *,其中 t2.ID = -1
)
关闭统计信息配置文件
选择
[RowCount] = @@RowCount,
[@@IDENTITY] = @@IDENTITY,
[SCOPE_IDENTITY] = SCOPE_IDENTITY () ,
[IDENT_CURRENT] = IDENT_CURRENT ('_ddr_T')
从@MyNewIdentityValues
go
如果情况需要使用这些函数之一,可以使用以下方法之一来解决此问题。
方法 1:
在查询中包括以下选项
OPTION (MAXDOP 1)
注意:这可能会损害查询的 SELECT 部分的性能。
方法 2:
将 SELECT 部分的值读入一组变量 (或单个表变量) 然后插入 MAXDOP=1 的目标表中。 由于 INSERT 计划不会是并行的,因此将获取正确的语义,但 SELECT 将并行实现所需的性能。
方法 3:
运行以下语句,将最大并行度 选项设置为 1:
sp_configure"最大并行度",1
go
使用 override 重新配置
go
注意:此方法可能会导致服务器性能下降。 除非在测试或过渡环境中评估过此方法,否则不应使用此方法。
更多信息
MAXDOP (的最大并行)https://msdn.microsoft.com/en-us/library/ms181007.aspx