NULL 値の許容と 3 値論理比較

適用対象:SQL Server

SQL Server のデータ型に慣れている場合は、.NET Framework の System.Data.SqlTypes 名前空間でも同様のセマンティクスと精度が見つかります。 ただし、いくつか違いもあります。このトピックでは、これらの違いの中から最も重要な点について説明します。

NULL 値

ネイティブ共通言語ランタイム (CLR) データ型と SQL Server データ型の主な違いは、前者では NULL 値を許可せず、後者は完全な NULL セマンティクスを提供することです。

比較は NULL 値の影響を受けます。 つまり、2 つの値 x と y を比較するときに、x または y が NULL の場合、一部の論理比較では true または false ではなく UNKNOWN 値に評価されます。

SqlBoolean データ型

System.Data.SqlTypes 名前空間には、この 3 値ロジックを表す SqlBoolean 型が導入されています。 SqlTypes 間の比較では、SqlBoolean 値型が返されます。 UNKNOWN 値は、SqlBoolean 型の null 値で表されます。 プロパティ IsTrueIsFalse、および IsNull は、SqlBoolean 型の値をチェックするために提供されます。

演算、関数、および NULL 値

すべての算術演算子 (+、-、*、/、%)、ビット演算子 (~、>、|) と、SqlType のオペランドまたは引数のいずれかが NULL の場合、ほとんどの関数は NULL を返します。 IsNull プロパティは常に true または false の値を返します。

精度

.NET Framework CLR の 10 進データ型の最大値は、SQL Server の数値データ型と 10 進データ型の最大値とは異なります。 さらに、.NET Framework CLR の 10 進データ型では、最大有効桁数が想定されます。 ただし、SQL Server の CLR では、 SqlDecimal は、SQL Server の 10 進データ型と同じ最大有効桁数と小数点以下桁数と同じセマンティクスを提供します。

オーバーフローの検出

.NET Framework CLR では、2 つの非常に大きな数値を追加しても、例外がスローされない可能性があります。 チェック演算子を使用しないと、負の整数に "回り込んだ" 結果が返されます。 System.Data.SqlTypes では、すべてのオーバーフロー エラーとアンダーフロー エラーと 0 除算エラーに対して例外がスローされます。

参照

.NET Framework での SQL Server データ型