Проблемы
Предположим, что вы используете Microsoft SQL Server 2016 или 2017. При обработке оптимизированных для памяти транзакций данных с помощью оптимизированных для памяти табличных переменных с инструкцией where exists вы можете получить неправильный результат.
Пример:
Шаг 1. Создание оптимизированной для памяти базы данных и таблицы.
Создание демонстрации базы данных
Демонстрация ALTER DATABASE ADD FILEGROUP demo_mod СОДЕРЖИТ MEMORY_OPTIMIZED_DATA
Alter DATABASE demo ADD FILE FILE (name='demo_mod1', filename='C:\DATA\demo_mod1') TO FILEGROUP demo_mod
Использование демонстрации
Пойти
CREATE TYPE dbo. IN_MEMORY_TABLE_TYPE AS TABLE
( source_col INT NULL,
target_col INT не NULL
ИНДЕКС IX_INMEMORYTABLE НЕКЛАСТЕРИЗОВАННЫЙ (target_col)
) WITH (MEMORY_OPTIMIZED = ON)
ПОЙТИ
Шаг 2. Вставка и обновление данных.
DECLARE @t dbo. IN_MEMORY_TABLE_TYPE
INSERT @t ( source_col, target_col ) ЗНАЧЕНИЯ (10, 0),(0, 0)
выбрать * из @t
UPDATE r1 SET target_col = -1 FROM @t r1
WHERE EXISTS ( SELECT * FROM @t r2 WHERE r2.source_col > 0 )
SELECT * FROM @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:
Статус
Корпорация Майкрософт подтверждает наличие этой проблемы в своих продуктах, которые перечислены в разделе "Применяется к".
Ссылки
Сведения о терминологии, которую корпорация Майкрософт использует для описания обновлений программного обеспечения.