KB4039776-修正:當您在 SQL Server 2016 或2017中使用含 [where exists] 語句的記憶體優化資料表時,不正確的行為

徵狀

假設您使用的是 Microsoft SQL Server 2016 或2017。 當您處理記憶體優化資料交易時,如果您使用的是含where 的 select 語句的記憶體優化資料表變數,您可能會收到錯誤的結果。

例如:

Step1:建立記憶體優化資料庫與資料表。

建立資料庫示範

ALTER DATABASE 示範新增 FILEGROUP demo_mod 包含 MEMORY_OPTIMIZED_DATA 

ALTER DATABASE 示範新增檔案(name = "demo_mod1",filename = "C:\DATA\ demo_mod1")到檔組 demo_mod 

使用示範

經過

建立類型 dbo。以表格方式 IN_MEMORY_TABLE_TYPE

(source_col INT Null,

target_col INT not Null

INDEX ix_InMemoryTable 非聚集(target_col)

) WITH (MEMORY_OPTIMIZED = 開啟)

經過

Step2:插入資料並更新資料。

宣告 @t dbo。IN_MEMORY_TABLE_TYPE

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

從 @t 中選取 [*]

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

WHERE 存在(在 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 |sr-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 用於描述軟體更新的詞彙

需要更多協助?

擴展您的技能
探索訓練
優先取得新功能
加入 Microsoft 測試人員

這項資訊有幫助嗎?

感謝您的意見反應!

×