KB4039776 - 修正:在 SQL Server 2016 或 2017 中使用記憶體最佳化資料表搭配 “where exists” 陳述式時,發生不正確的行為

套用到
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:建立記憶體最佳化的資料庫和資料表。

建立資料庫示範

ALTER DATABASE 示範 ADD FILEGROUP demo_mod包含MEMORY_OPTIMIZED_DATA

ALTER DATABASE DEMO ADD FILE (name='demo_mod1', filename='C:\DATA\demo_mod1') TO FILEGROUP demo_mod

使用示範

開始

建立類型 dbo。IN_MEMORY_TABLE_TYPE做為表格

( source_col INT NULL,

target_col INT NOT NULL

非叢集 (target_col) ix_InMemoryTable索引

(MEMORY_OPTIMIZED = 開啟的) )

GO

步驟 2:插入資料和更新資料。

DECLARE @t dbo。IN_MEMORY_TABLE_TYPE

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

*select * from @t*

從 R1 更新 R1 設定 @t target_col = -1

存在的位置 ( 選取 * FROM @t R2 WHERE r2.source_col > 0 )

*選擇 * 來自 @t*

GO

步驟 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 2017 累積更新 1

SQL Server 2016 SP1 的累積更新 5

關於 SQL Server 的累積更新:

SQL Server 的每個新累積更新都包含所有 Hotfix 和先前累積更新的所有安全性修正程式。 查看 SQL Server 的最新累積更新:

適用於 SQL Server 2017 的最新累積更新

SQL Server 2016 的最新累積更新

狀態

Microsoft 已確認這是「適用對象」一節中列出的 Microsoft 產品中的問題。

參考資料

了解 Microsoft 用來說明軟體更新的術語。