KB981037 - 修正: SQL Server 2008 で ISNULL() 関数を使用して null 許容列の値を選択するクエリを実行すると、「Attempting to set a non-NULL-able column's value to NULL」というエラー メッセージが表示される

マイクロソフトでは、Microsoft SQL Server 2008 の修正を 1 つのダウンロード可能なファイルとして配布しています。 修正は累積的であるため、新しいリリースの修正には、以前のリリースの SQL Server 2008 の修正に含まれていたすべての修正プログラムおよびセキュリティ更新プログラムが含まれます。

現象

たとえば次のようなシナリオを考えてみます。

  • Microsoft SQL Server 2008 では、ISNULL() 関数を使用して null 許容列の値を選択するクエリを実行します。
  • null 許容列を含むテーブルは、null 許容列ので別のテーブルと結合されます。
  • クエリ オプティマイザによって作成されるクエリ プランは、JOIN 演算子の下のハッシュ結合、スプール、または並べ替えテーブルを使用します。

このとき、次のエラー メッセージが表示されます。

注

メッセージ 681、レベル 16、状態 3、行 2

NULL に設定できない列の値を NULL に設定しようとしています。

原因

結合演算子が NULL 値を拒否するため、クエリ オプティマイザは ISNULL() 関数で参照されている列を null 許容できないと判断します。 次に、クエリ プランで、クエリ オプティマイザは ISNULL() 関数に含まれる式を JOIN 演算子の下にプッシュします。 また、式の値は NULL にすることができます。 ただし、クエリ オプティマイザは、式の null 許容プロパティを再派生しません。 次に、クエリ プランで、作業テーブルを使用して、式を含むハッシュ結合、スプール、またはソート表を実装します。 さらに、作業テーブルの対応する列は null 許容不可として宣言されます。 SQL Server クエリ エンジンが NULL 値をワーク テーブルに挿入しようとすると、エラーが発生します。

解決策

この問題の修正プログラムは、SQL Server 2008 Service Pack 1 の累積的な更新プログラム 7 で最初にリリースされました。 この累積的な更新プログラム パッケージの関連情報を参照するには、以下の「サポート技術情報」 (Microsoft サポート技術情報) をクリックしてください。

979065 SQL Server 2008 Service Pack 1 の累積的な更新プログラム パッケージ 7 注: ビルドは累積的であるため、新しくリリースされた修正プログラムには、以前の SQL Server 2008 更新プログラムのリリースに含まれていたすべての修正プログラムおよびセキュリティ更新プログラムが含まれています。 この修正プログラムが含まれている最新リリースの修正の適用を検討することを推奨します。 詳細については、次のマイクロソフト サポート技術情報番号をクリックしてください。

970365 SQL Server 2008 Service Pack 1 以降にリリースされた SQL Server 2008 ビルド
Microsoft SQL Server 2008 の修正プログラムは、特定の SQL Server Service Pack 用に作成されます。 SQL Server 2008 Service Pack 1 のインストールには、SQL Server 2008 Service Pack 1 修正プログラムを適用する必要があります。 既定では、1 つの SQL Server Service Pack で提供されているすべての修正プログラムは、次の SQL Server Service Pack に含まれています。

回避策

この問題を回避するには、以下のいずれかの方法を使用します。

方法 1

クエリから ISNULL() 関数を削除します。

注: この関数の列は、NULL 値を拒否する JOIN 演算子から取得されるため、ISNULL() 関数は冗長です。

方法 2

クエリ プランがハッシュ結合、スプール、またはソート テーブルを使用しないようにクエリを書き換えます。 たとえば、クエリに ORDER BY 句が含まれている場合は、必要な順序付けを提供し、必要なすべての列を含むクラスター化インデックスまたはカバー インデックスを作成します。 この方法を使用する場合、クエリ オプティマイザは並べ替えテーブルを使用しません。

状態

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

参考資料

SQL Server の増分サービス モデルの関連情報を参照するには、以下の「サポート技術情報」 (Microsoft サポート技術情報) をクリックしてください。

935897 報告された問題に対する修正プログラムを提供する SQL Server チームの増分サービス モデル (ISM) について

SQL Server の更新プログラムの命名方式の関連情報を参照するには、以下のサポート技術情報番号をクリックしてください。

822499 Microsoft SQL Server ソフトウェア更新プログラム パッケージの新しい名前付けスキーマ

ソフトウェア更新プログラムに関する用語の関連情報を参照するには、以下のサポート技術情報番号をクリックしてください。

824684 Microsoft のソフトウェア更新プログラムの説明で使用される一般的な用語の解説