現象
Microsoft SQL Server 2016 または 2017 を使用していることを前提としています。 where exists ステートメントでメモリ最適化テーブル変数を使用してメモリ最適化データ トランザクションを処理すると、間違った結果が得られる可能性があります。
以下に例を示します。
手順 1: メモリ最適化データベースとテーブルを作成します。
DATABASE デモを作成する
ALTER DATABASE デモ 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。AS TABLE のIN_MEMORY_TABLE_TYPE
( source_col INT NULL,
TARGET_COL INT not NULL
INDEX ix_InMemoryTable NONCLUSTERED (target_col)
) WITH (MEMORY_OPTIMIZED = ON)
行く
手順 2: データを挿入し、データを更新します。
dbo @t宣言します。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の各新しい累積的な更新プログラムには、すべての修正プログラムと、以前の累積的な更新プログラムに含まれていたすべてのセキュリティ修正プログラムが含まれています。 SQL Serverの最新の累積的な更新プログラムを確認してください。
状態
マイクロソフトでは、この問題をこの資料の対象製品として記載されているマイクロソフト製品の問題として認識しています。
関連情報
Microsoft がソフトウェア更新プログラムの説明に使用する用語について説明します。