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

应用对象
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
当 SOURCE THEN 不匹配时
  UPDATE SET @NotMatchedBySource = @NotMatchedBySource + 1;

PRINT @NotMatchedBySource;

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

状态

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

解决方法

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

关于SQL Server的累积更新:

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

参考资料

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