KB4046745 - 修正: SQL Server 2014、2016、または 2017 の 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 の累積的な更新プログラム CU 38

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

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

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

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

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

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

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

状態

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

参考資料

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