KB4046745 - 修正: 2014 年、2016 年、または 2017 年 SQL Serverの WHERE 句で存在しないパーティション関数を参照すると、UPDATE ステートメントがサイレントに失敗する

適用先
SQL Server 2014 Service Pack 2 - duplicate (do not use) SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Enterprise Core - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use) SQL Server 2017 Developer SQL Server 2017 Enterprise Core SQL Server 2017 Enterprise SQL Server 2016 Service Pack 1 SQL Server 2016 Developer - duplicate (do not use) SQL Server 2016 Enterprise - duplicate (do not use) SQL Server 2016 Enterprise Core - duplicate (do not use) SQL Server 2016 Standard - duplicate (do not use)

現象

Microsoft SQL Server 2014、2016、または 2017 の$PARTITION キーワード (keyword)を使用して、存在しないパーティション関数を参照する UPDATE ステートメントがあるとします。 たとえば、

UPDATE TableName SET ColumnName='xyz' WHERE $PARTITION。NonExistingPartitionFunction(ColumnName) = 1

この状況では、SQL Serverは更新を実行せず、NonExistingPartitionFunction オブジェクトが存在しないことを示すエラー メッセージを返します。 しかし、ユーザーの観点からは、 UPDATE ステートメントは正常に実行されているようですが、実際には失敗しました。

原因

バッチを実行すると、SQL Server遅延名前解決 (DNR) が実行される場合があります。 このプロセスでは、存在しないオブジェクトが検出された場合、SQL Serverはすぐにはエラーを生成しません。また、そのオブジェクトを参照するステートメントの実行前に、モジュールまたはバッチによってオブジェクトが作成されることを想定しています。 パーティション関数の場合、SQL Serverは DNR を正しく処理しません。

追加情報

DNR の詳細については、「 遅延名前解決」を参照してください。

解決策

この問題は、SQL Serverの次の累積的な更新プログラムで修正されています。

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

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

SQL Server 2014 SP2 の累積的な更新プログラム 9

SQL Serverの累積的な更新プログラムについて:

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

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

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

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

状態

Microsoft は、これが "適用対象" セクションに記載されている Microsoft 製品の問題であることを確認しました。

参考資料

マイクロソフトでソフトウェア更新プログラムの説明に使用する用語集を参照してください。