Ознаки
Припустімо, що ви використовуєте Microsoft SQL Server 2016 або 2017. Під час обробки операцій даних, оптимізованих пам'яті за допомогою оптимізованої пам'яті таблиці змінних, де існує оператор, ви можете отримати неправильний результат.
Наприклад:
Крок 1. Створення оптимізованої пам'яті бази даних і таблиці.
Демонстрація створення бази даних
ALTER DATABASE demo ADD FILEGROUP demo_mod CONTAINS MEMORY_OPTIMIZED_DATA
ALTER DATABASE demo ADD 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 not NULL
INDEX ix_InMemoryTable NONCLUSTERED (target_col)
) WITH (MEMORY_OPTIMIZED = ON)
ЙТИ
Крок 2. Вставлення даних і оновлення даних.
DECLARE @t dbo. IN_MEMORY_TABLE_TYPE
ВСТАВИТИ @t ( source_col, target_col ) ЗНАЧЕННЯ (10, 0);(0; 0)
select * from @t
UPDATE r1 SET target_col = -1 FROM @t R1
WHERE EXISTS (ВИБРАТИ * 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:
Стан
Корпорація Майкрософт підтвердила, що це проблема в продуктах Microsoft, перелічених у розділі "Стосується".
Посилання
Дізнайтеся про термінологію, яку корпорація Майкрософт використовує для опису оновлень програмного забезпечення.