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
ソースと一致しない場合は、
  UPDATE SET @NotMatchedBySource = @NotMatchedBySource + 1;

印刷 @NotMatchedBySource;
GO

この場合、MERGE ステートメントの後の @NotMatchedBySource の値が、ソースによって一致しない実際の行数を反映していないことがあります。

状態

Microsoft は、これが "適用対象" セクションに記載されている Microsoft 製品の問題であることを確認しました。

解決策

この問題は、次の SQL Server の累積的な更新プログラムで修正されています

SQL Server の累積的な更新プログラムについて:

SQL Server 用の新しい累積的な更新プログラムには、以前の累積的な更新プログラムに含まれていたすべての修正プログラムとすべてのセキュリティ修正プログラムが含まれています。 SQL Server の最新の累積的な更新プログラムを確認してください。

参考資料

マイクロソフトでソフトウェア更新プログラムの説明に使用する用語集を参照してください。