KB4502400 - 修复:当您使用为每一行执行局部变量赋值的 MERGE 语句时,SQL Server 2014、2016 和 2017 不执行请求的行前分配

应用对象
SQL Server 2016 Service Pack 2 SQL Server 2016 Developer - duplicate (do not use) SQL Server 2016 Enterprise - duplicate (do not use) SQL Server 2016 Enterprise Core - duplicate (do not use) SQL Server 2016 Standard - duplicate (do not use) SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Enterprise Core - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use)

症状

假设您使用 MERGE 语句找出源不匹配的行数,并将其存储在局部变量中,如下所示:

DECLARE
  @NotMatchedBySource INT = 0;

MERGE TargetTable USING SourceTable ON TargetTable.id = SourceTable.id
如果与源不匹配,则
  更新集 @NotMatchedBySource = @NotMatchedBySource + 1;

打印 @NotMatchedBySource;
GO

在这种情况下,你可能会注意到,MERGE 语句后面的 @NotMatchedBySource 值可能不能反映源不匹配的实际行数。

状态

Microsoft 已确认在 "适用于" 部分中所列的 Microsoft 产品中存在问题。

解决方法

此问题已在 SQL Server 的以下累积更新中修复

关于 SQL Server 的累积更新:

SQL Server 的每个新累积更新都包含上一个累积更新中包含的所有修补程序和所有安全修补程序。 查看 SQL Server 的最新累积更新:

参考资料

了解 Microsoft 用于描述软件更新的术语。