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
ЕСЛИ НЕ СООТВЕТСТВУЕТ ИСТОЧНИКУ, ТО
  UPDATE SET @NotMatchedBySource = @NotMatchedBySource + 1;

ПЕЧАТЬ @NotMatchedBySource;
ПОЙТИ

В этой ситуации можно заметить, что значение @NotMatchedBySource после инструкции MERGE может не отражать фактическое количество строк, которые не соответствуют источнику.

Состояние

Корпорация Майкрософт подтвердила, что это проблема продуктов Microsoft, перечисленных в разделе «Относится к».

Решение

Эта проблема устранена в следующих накопительных обновлениях для SQL Server

Сведения о накопительных обновлениях для SQL Server:

Каждое новое накопительное обновление для SQL Server содержит все исправления и все исправления для системы безопасности, которые были включены в предыдущее накопительное обновление. Ознакомьтесь с последними накопительными обновлениями для SQL Server:

Ссылки

Узнайте о терминологии, используемой корпорацией Майкрософт для описания обновлений программного обеспечения.