KB4039776 - ИСПРАВЛЕНО: некорректное поведение при использовании оптимизированных для памяти таблиц с оператором where exists в SQL Server 2016 или 2017

Применяется к
SQL Server 2016 Service Pack 1 SQL Server 2016 Enterprise Core - duplicate (do not use) SQL Server 2016 Enterprise - duplicate (do not use) SQL Server 2016 Developer - duplicate (do not use) SQL Server 2016 Standard - duplicate (do not use) SQL Server 2017 on Windows (all editions)

Проблема

Предположим, что вы используете Microsoft SQL Server 2016 или 2017. При обработке оптимизированных для памяти транзакций данных с помощью оптимизированных для памяти табличных переменных с оператором where exists можно получить неверный результат.

Например:

Шаг 1. Создание базы данных и таблицы, оптимизированных для памяти.

Создать демонстрационную версию БАЗЫ данных

ДЕМОНСТРАЦИЯ ФУНКЦИИ ALTER DATABASE ADD FILEGROUP demo_mod СОДЕРЖИТ MEMORY_OPTIMIZED_DATA

ALTER DATABASE DEMO ADD FILE (NAME='demo_mod1', filename='C:\DATA\demo_mod1') В demo_mod FILEGROUP

Использовать демонстрацию

Перейти

СОЗДАЙТЕ ТИП DBO. IN_MEMORY_TABLE_TYPE В ВИДЕ ТАБЛИЦЫ

( source_col INT NULL,

target_col INT not NULL

ИНДЕКС ix_InMemoryTable НЕКЛАСТЕРИЗОВАННАЯ (target_col)

) С ПОМОЩЬЮ (MEMORY_OPTIMIZED = ВКЛ.)

ПЕРЕЙТИ

Шаг 2. Вставка и обновление данных.

ОБЪЯВИТЕ @t ДБО. IN_MEMORY_TABLE_TYPE

ВСТАВКА @t ( source_col, target_col ) ЗНАЧЕНИЯ (10, 0),(0, 0)

*Выбрать * из @t*

ОБНОВЛЕНИЕ R1 SET target_col = -1 С @t R1

WHERE EXISTS ( SELECT * FROM @t r2 WHERE r2.source_col > 0 )

*ВЫБРАТЬ * В СПИСКЕ @t*

ПЕРЕЙТИ

Шаг 3. Проверьте результаты.

Фактические результаты: не все строки переменной таблицы @t обновляться.

source_col | target_col


10 | -1

0 | 0

Ожидаемые результаты. Все строки должны быть обновлены — target_col = -1.

source_col | target_col


10 | -1

0 | -1.

Решение

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

Накопительный пакет обновления 1 для SQL Server 2017

Накопительный пакет обновления 5 для SQL Server 2016 с пакетом обновления 1 (SP1)

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

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

Последний накопительный пакет обновления для SQL Server 2017

Последние накопительные пакеты обновления для SQL Server 2016

Состояние

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

Ссылки

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