徵兆
假設您使用的是 Microsoft SQL Server 2016 或 2017。 當您使用記憶體優化表格變數搭配存在語句來 處理記憶體優化的資料交易時,可能會得到錯誤的結果。
例如:
步驟 1:建立記憶體優化的資料庫和資料表。
建立 DATABASE 示範
ALTER DATABASE demo ADD FILEGROUP demo_mod CONTAINS MEMORY_OPTIMIZED_DATA
ALTER DATABASE demo ADD FILE (name='demo_mod1', filename='C:\DATA\demo_mod1') TO FILEGROUP demo_mod
使用示範
去
CREATE TYPE dbo.IN_MEMORY_TABLE_TYPE AS 表格]
( source_col INT Null,
target_col INT 而非 Null
INDEX ix_InMemoryTable NONCLUSTERED (target_col)
) WITH (MEMORY_OPTIMIZED = 開啟)
去
步驟 2:插入資料並更新資料。
DECLARE @t dbo。IN_MEMORY_TABLE_TYPE
INSERT @t ( source_col、target_col ) VALUES (10、0) 、 (0、0)
從 @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累積更新中修正:
每個SQL Server的新累積更新都包含所有 Hotfix 以及先前累積更新隨附的所有安全性修正。 查看SQL Server的最新累積更新:
狀態
Microsoft 已確認<適用於>一節中所列的 Microsoft 產品確實有上述問題。
參考資料
瞭解 Microsoft 用來描述軟體更新的術語。