应用对象
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:创建内存优化的数据库和表。

创建 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累积更新中修复了此问题:

      2017 SQL Server累积更新 1 

      SQL Server 2016 SP1 的累积更新 5

SQL Server的每个新累积更新都包含以前的累积更新中包含的所有修补程序和所有安全修补程序。 查看SQL Server的最新累积更新:

SQL Server 2017 的最新累计更新

2016 SQL Server的最新累积更新

状态

Microsoft 已确认这是在“适用范围”部分中列出的 Microsoft 产品存在的问题。

参考

了解 Microsoft 用于描述软件更新的术语

需要更多帮助?

需要更多选项?

了解订阅权益、浏览培训课程、了解如何保护设备等。