使用 Microsoft 登录
登录或创建帐户。
你好,
使用其他帐户。
你有多个帐户
选择要登录的帐户。

症状

假设你使用的是 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 用于描述软件更新的术语

需要更多帮助?

需要更多选项?

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

社区可帮助你提出和回答问题、提供反馈,并听取经验丰富专家的意见。

此信息是否有帮助?

你对语言质量的满意程度如何?
哪些因素影响了你的体验?
按“提交”即表示你的反馈将用于改进 Microsoft 产品和服务。 你的 IT 管理员将能够收集此数据。 隐私声明。

谢谢您的反馈!

×