6

null以外の「quantity」(decimal)列と「status」(int)列を持つProductテーブルがあり、次のケース式を使用してこのテーブルにビューを作成しました。

SELECT P.ProductTypeId,
       (CASE WHEN P.StatusId IN (5, 8) THEN 0 ELSE -P.Quantity END) AS Quantity,
       ...
FROM Product P

ProductTypeIdは、null以外として正しく推測されます。ただし、基になる列がNULL可能ではない場合でも、このビューの数量列はNULL可能であると推測されます。これは私には意味がありません。

この場合、ISNULL / COALESCEを使用してデフォルト値を提供し、null可能性を強制することはできますが、意味のあるデフォルト値はありません。これは、私が理解していることから、そもそも発生しないはずです。何が起こっているのかアイデアはありますか?

4

1 に答える 1

7

以下の説明は、テーブル内の計算列に関するものです。同じことがビューの計算列にも当てはまると思います。

データベースエンジンは、使用される式に基づいて、計算列のnull可能性を自動的に判断します。ほとんどの式の結果は、null不可能な列のみが存在する場合でも、null可能と見なされます。これは、アンダーフローまたはオーバーフローの可能性があると、nullの結果も生成されるためです。COLUMNPROPERTY関数をAllowsNullプロパティとともに使用して、テーブル内の計算列のnull可能性を調査します。null可能である式は、ISNULL(check_expression、constant)を指定することにより、null不可能な式に変換できます。定数はnullの結果の代わりにnull以外の値です。

式が返さNULLれる可能性のある例は次のとおりです。

SET ARITHABORT OFF;
SET ANSI_WARNINGS OFF;

WITH Product(Quantity,StatusId) As
(
SELECT -2147483648,1
)
SELECT (CASE WHEN P.StatusId IN (5, 8) THEN 0 ELSE -P.Quantity END) AS Quantity  
FROM Product P
于 2011-05-17T17:00:34.423 に答える