症状

假设您使用的是 Microsoft SQL Server 2016 或2017。 当您通过将内存优化表变量与where exists 语句进行处理来处理内存优化数据事务时,可能会出现错误结果。

例如:

Step1:创建内存优化数据库和表。

创建数据库演示

ALTER DATABASE demo 添加文件组 demo_mod 包含 MEMORY_OPTIMIZED_DATA 

ALTER DATABASE demo 将文件(名称 = "demo_mod1",文件名 = "C:\DATA\ demo_mod1")添加到文件组 demo_mod 

使用演示

转向

创建类型 dbo。以表格形式 IN_MEMORY_TABLE_TYPE

(source_col INT NULL,

target_col INT not NULL

索引 ix_InMemoryTable 非聚集的(target_col)

)替换为(MEMORY_OPTIMIZED = ON)

转向

Step2:插入数据并更新数据。

声明 @t dbo。IN_MEMORY_TABLE_TYPE

插入 @t (source_col,target_col)值(10,0),(0,0)

从 @t 中选择 "*"

从 @t r1 更新 r1 集 target_col =-1

其中存在(从 r2.source_col > 0 的 @t r2 中选择 "*")

从 @t 中选择 "*"

转向

Step3:检查结果。

实际结果:并非所有表变量的行都 @t 更新。

source_col | target_col

----------------------

10 |-1

0 |0

预期结果:所有行应更新为具有 target_col =-1

source_col | target_col

----------------------

10 |-1

0 |raid-1.

解决方案

在 SQL Server 的以下累积更新中修复了此问题:

      SQL Server 2017 的累积更新1 

      SQL Server 2016 SP1 的累积更新5

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

SQL Server 2017 的最新累计更新

SQL Server 2016 的最新累积更新

状态

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

参考

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

Need more help?

扩展你的技能

了解培训 >

抢先获得新功能

加入 Microsoft 内部人员 >

Was this information helpful?

How satisfied are you with the translation quality?
What affected your experience?

Thank you for your feedback!

×