症狀
假設您使用的是 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 的累積更新:
SQL Server 的每個新累積更新都包含所有 Hotfix 和先前累積更新的所有安全性修正程式。 查看 SQL Server 的最新累積更新:
狀態
Microsoft 已確認這是「適用對象」一節中列出的 Microsoft 產品中的問題。
參考資料
了解 Microsoft 用來說明軟體更新的術語。