症状
假设你使用的是 Microsoft SQL Server 2016 或 2017。 使用内存优化表变量和 where exists 语句处理内存优化的数据事务时,可能会得到错误的结果。
例如:
步骤 1:创建内存优化的数据库和表。
创建 DATABASE 演示
ALTER DATABASE 演示 ADD FILEGROUP demo_mod 包含MEMORY_OPTIMIZED_DATA
ALTER DATABASE 演示 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 不为 NULL
INDEX ix_InMemoryTable NONCLUSTERED (target_col)
) WITH (MEMORY_OPTIMIZED = ON)
去
步骤 2:插入数据和更新数据。
DECLARE @t dbo。IN_MEMORY_TABLE_TYPE
INSERT @t ( source_col,target_col ) 值 (10、0) 、 (0、0)
select * from @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累积更新中修复了此问题:
SQL Server的每个新累积更新都包含以前的累积更新中包含的所有修补程序和所有安全修补程序。 查看SQL Server的最新累积更新:
状态
Microsoft 已确认这是在“适用范围”部分中列出的 Microsoft 产品存在的问题。
参考
了解 Microsoft 用于描述软件更新的术语。