Проблема
Предположим, что вы используете 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, перечисленных в разделе «Относится к».
Ссылки
Узнайте о терминологии, используемой корпорацией Майкрософт для описания обновлений программного обеспечения.