NULL 値の許容と 3 値論理比較
SQL Server のデータ型に慣れているユーザーであれば、.NET Framework の System.Data.SqlTypes 名前空間でもよく似たセマンティクスや有効桁数を使用していることがわかるはずです。ただし、いくつか違いもあります。このトピックでは、これらの違いの中から最も重要な点について説明します。
NULL 値
CLR (共通言語ランタイム) のネイティブ データ型と SQL Server データ型の主な違いは、CLR データ型では NULL 値が許容されないのに対して、SQL Server データ型では完全な NULL セマンティクスが用意されているという点です。
比較は NULL 値の影響を受けます。つまり、2 つの値 x と y を比較するときに、x または y が NULL の場合、一部の論理比較では true または false ではなく UNKNOWN 値に評価されます。
SqlBoolean データ型
System.Data.SqlTypes 名前空間では、この 3 つの論理値を表す SqlBoolean 型が導入されます。SqlTypes 間の比較では、SqlBoolean 型の値が返されます。UNKNOWN 値は、SqlBoolean 型の NULL 値で表現されます。SqlBoolean 型の値を確認するために、プロパティ IsTrue、IsFalse、および IsNull が用意されています。
演算、関数、および NULL 値
SqlTypes 型のオペランドまたは引数のいずれかが NULL の場合、すべての算術演算子 (+、-、*、/、%)、ビットごとの演算子 (~、&、|)、および大部分の関数から NULL が返されます。IsNull プロパティで返される値は、常に true または false です。
有効桁数
.NET Framework CLR の decimal データ型の最大値は、SQL Server の numeric データ型や decimal データ型の最大値とは異なります。また、.NET Framework CLR の decimal データ型では、最大有効桁数が想定されます。ただし、SQL Server の CLR で、SqlDecimal の最大有効桁数、最大小数点以下桁数、およびセマンティクスは、SQL Server の decimal データ型と同じです。
オーバーフローの検出
.NET Framework CLR では、非常に大きな 2 つの数を加算しても例外がスローされないことがあります。チェック演算子を使用しないと、負の整数に "回り込んだ" 結果が返されます。System.Data.SqlTypes では、すべてのオーバーフロー エラー、アンダーフロー エラー、および 0 除算エラーに対して例外がスローされます。