メイン コンテンツへスキップ
サポート
Microsoft アカウントでサインイン
サインインまたはアカウントを作成してください。
こんにちは、
別のアカウントを選択してください。
複数のアカウントがあります
サインインに使用するアカウントを選択してください。

現象

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 2017 の累積的な更新プログラム 1 

      SQL Server 2016 SP1 の累積的な更新プログラム 5

SQL Serverの各新しい累積的な更新プログラムには、すべての修正プログラムと、以前の累積的な更新プログラムに含まれていたすべてのセキュリティ修正プログラムが含まれています。 SQL Serverの最新の累積的な更新プログラムを確認してください。

SQL Server 2017 の最新の累積的な更新プログラム

SQL Server 2016 の最新の累積的な更新プログラム

状態

マイクロソフトでは、この問題をこの資料の対象製品として記載されているマイクロソフト製品の問題として認識しています。

関連情報

Microsoft がソフトウェア更新プログラムの説明に使用する用語について説明します。

ヘルプを表示

その他のオプションが必要ですか?

サブスクリプションの特典の参照、トレーニング コースの閲覧、デバイスのセキュリティ保護方法などについて説明します。

コミュニティは、質問をしたり質問の答えを得たり、フィードバックを提供したり、豊富な知識を持つ専門家の意見を聞いたりするのに役立ちます。

この情報は役に立ちましたか?

言語の品質にどの程度満足していますか?
どのような要因がお客様の操作性に影響しましたか?
[送信] を押すと、Microsoft の製品とサービスの改善にフィードバックが使用されます。 IT 管理者はこのデータを収集できます。 プライバシーに関する声明。

フィードバックをいただき、ありがとうございます。

×