SQL Serverでは、ANSI_NULLS 設定により、NULLの方法を指定できます 値はクエリで扱われます。
具体的には、Equals(=)のISO準拠の動作を指定できます。 )および等しくない(<> )NULLで使用される場合の比較演算子 値。
ANSI_NULLS ONに設定できます またはOFF 。 NULL ANSI_NULLS OFFでtrueを返すテスト ANSI_NULLS ONで実際にfalseを返す場合があります 。
これは多くの混乱の原因となる可能性があるため、ANSI_NULLSがどのように行われるかを正確に理解することは有益です。 動作します。
ANSI_NULLS 設定は、データベースレベルとセッションレベルで設定できます。 ANSI_NULLSの場合 セッションレベルでの設定が指定されていない場合、SQLServerはANSI_NULLSのいずれかを使用します 設定は現在のデータベースに適用されます。したがって、アドホッククエリを作成するときに、データベース設定を独自のセッションレベル設定で上書きできます。
注意すべき重要な点は、SQLServerネイティブクライアントODBCドライバーとSQLServerネイティブクライアントOLEDBプロバイダーforSQLServerが自動的にANSI_NULLSを設定することです。 ONへ 接続するとき。この設定は、ODBCデータソース、ODBC接続属性、またはSQLServerのインスタンスに接続する前にアプリケーションで設定されるOLEDB接続プロパティで構成できます。
セッションのANSI_NULLS設定を確認する方法
SESSIONPROPERTY()を使用できます ANSI_NULLSをチェックする関数 現在のセッションの設定。
SELECT SESSIONPROPERTY('ANSI_NULLS'); 結果:
+--------------------+ | (No column name) | |--------------------| | 1 | +--------------------+
この場合、ANSI_NULLS セッションの設定はONです 。
ゼロ(0 )オフであることを意味します。
セッションのANSI_NULLS設定を変更する方法
セッションのANSI_NULLS設定をOFFに設定できます 次のコードで:
SET ANSI_NULLS OFF; 次に、もう一度チェックするとゼロが生成されます。
SELECT SESSIONPROPERTY('ANSI_NULLS'); 結果:
+--------------------+ | (No column name) | |--------------------| | 0 | +--------------------+
SET ANSI_NULLSのデフォルト値 OFFです 。ただし、前述のように、SQLServerネイティブクライアントODBCドライバーとSQLServerネイティブクライアントOLEDBプロバイダーforSQLServerは自動的にANSI_NULLSを設定します。 ONへ 接続するとき。
ANSI_NULLSの例 クエリに影響します
ANSI_NULLSの値に応じて、さまざまな結果を得ることができるいくつかの基本的な例を次に示します。 設定。
これらはSET ANSI_NULLSを使用します ANSI_NULLSを切り替えるには 現在のセッションの設定。
ANSI_NULLS ON
SET ANSI_NULLS ON;
SELECT NULL
WHERE NULL = NULL; 結果:
(0 rows affected)
ANSI_NULLSの場合 ONです 、NULLに対するすべての比較 値はUNKNOWNに評価されます 。
この場合、NULLとは言えません。 NULLに等しい それぞれの値が不明だからです。
したがって、上記のクエリでは行は返されません。
ANSI_NULLS OFF
SET ANSI_NULLS OFF;
SELECT NULL
WHERE NULL = NULL; 結果:
+--------------------+ | (No column name) | |--------------------| | NULL | +--------------------+
ANSI_NULLSの場合 OFFです 、NULLに対するすべてのデータの比較 値はTRUEに評価されます データ値がNULLの場合 。
Not Equal To演算子(<>)を使用する場合も、同じロジックが適用されます。 。
例を拡張して、等しくない演算子(<>)を含めましょう )、およびNULL間の比較 および非NULL 値。
ANSI_NULLS ON
SET ANSI_NULLS ON;
SELECT NULL
WHERE NULL = NULL;
SELECT 'Not NULL'
WHERE NULL <> NULL;
SELECT NULL
WHERE 1 = NULL;
SELECT 'Not NULL'
WHERE 1 <> NULL; 結果:
(0 rows affected) (0 rows affected) (0 rows affected) (0 rows affected)
予想どおり、どのクエリに対しても行は返されません。これは、NULLが原因です 値はUNKNOWNとして扱われます ANSI_NULLSの場合の値 ONです 。
ANSI_NULLS OFF
SET ANSI_NULLS OFF;
SELECT NULL
WHERE NULL = NULL;
SELECT 'Not NULL'
WHERE NULL <> NULL;
SELECT NULL
WHERE 1 = NULL;
SELECT 'Not NULL'
WHERE 1 <> NULL; 結果:
+--------------------+ | (No column name) | |--------------------| | NULL | +--------------------+ (1 row affected) (0 rows affected) (0 rows affected) +--------------------+ | (No column name) | |--------------------| | Not NULL | +--------------------+ (1 row affected)
ANSI_NULLSの場合、異なる結果が得られます OFFです 。
この場合、SQLServerはNULLを処理しません UNKNOWNとして 。 NULLであると判断します 実際にはNULLと同じです 。
これはANSI規格に準拠していません。
IS NULL 述語
ANSI_NULLSに関係なく、スクリプトが意図したとおりに機能するため データベースオプションまたはSET ANSI_NULLSの設定 、IS NULLを使用します およびIS NOT NULL null値を含む可能性のある比較で
前の例をIS NULLを使用するように書き直した場合は次のようになります。 およびIS NOT NULL 。
ANSI_NULLS ON
SET ANSI_NULLS ON;
SELECT NULL
WHERE NULL IS NULL;
SELECT NULL
WHERE NULL IS NOT NULL;
SELECT 'Not NULL'
WHERE 1 IS NULL;
SELECT 'Not NULL'
WHERE 1 IS NOT NULL; 結果:
+--------------------+ | (No column name) | |--------------------| | NULL | +--------------------+ (1 row affected) (0 rows affected) (0 rows affected) +--------------------+ | (No column name) | |--------------------| | Not NULL | +--------------------+ (1 row affected)
ANSI_NULLS OFF
SET ANSI_NULLS OFF;
SELECT NULL
WHERE NULL IS NULL;
SELECT NULL
WHERE NULL IS NOT NULL;
SELECT 'Not NULL'
WHERE 1 IS NULL;
SELECT 'Not NULL'
WHERE 1 IS NOT NULL; 結果:
+--------------------+ | (No column name) | |--------------------| | NULL | +--------------------+ (1 row affected) (0 rows affected) (0 rows affected) +--------------------+ | (No column name) | |--------------------| | Not NULL | +--------------------+ (1 row affected)
予想どおり、ANSI_NULLSに関係なく、同じ結果が得られます。 設定。
比較表
次の表は、ブール式とANSI_NULLSに応じて取得できるバリエーションの概要を示しています。 設定。
| ブール式 | SET ANSI_NULLS ON | ANSI_NULLSOFFを設定 |
|---|---|---|
| NULL =NULL | 不明 | TRUE |
| 1 =NULL | 不明 | FALSE |
| NULL <> NULL | 不明 | FALSE |
| 1 <> NULL | 不明 | TRUE |
| NULL> NULL | 不明 | 不明 |
| 1> NULL | 不明 | 不明 |
| NULL IS NULL | TRUE | TRUE |
| 1はNULLです | FALSE | FALSE |
| NULLはNULLではありません | FALSE | FALSE |
| 1はNULLではありません | TRUE | TRUE |
データベースレベルでのANSI_NULLSの設定
各SQLServerデータベースにはANSI_NULLSがあります NULLとの比較方法を決定する設定 値が評価されます。
-
ONに設定されている場合 、NULLとの比較 値はUNKNOWNに評価されます 。 -
OFFに設定されている場合 、非Unicode値とNULLとの比較 値はTRUEに評価されます 両方の値がNULLの場合 。
次のコードを使用して、データベースでこの設定を変更できます。
ALTER DATABASE CURRENT
SET ANSI_NULLS ON;
ANSI_NULLSを設定します ONへ 現在のデータベースの場合。 CURRENTを交換できます 必要に応じてデータベースの名前を付けます。
DATABASEPROPERTYEX()で現在の設定を確認できます 機能。
SELECT DATABASEPROPERTYEX('Music','IsAnsiNullsEnabled'); 結果:
1
前述のように、アドホッククエリを作成するときに、前に行ったようにセッションレベルで設定することで、この設定を上書きできます。
このトピックについて説明している間、SQLServerデータベースにもANSI_NULL_DEFAULTがあることに注意してください。 設定。この設定により、デフォルト値のNULLが決まります。 またはNOT NULL 、CREATE TABLEでnull可能性が明示的に定義されていない列またはCLRユーザー定義型の またはALTER TABLE ステートメント。
この値は次のように設定できます:
ALTER DATABASE CURRENT
SET ANSI_NULL_DEFAULT ON; その値は次のように取得できます:
SELECT DATABASEPROPERTYEX('Music','IsAnsiNullDefault'); 結果:
1
sys.databasesを使用することもできます すべてのデータベースのこれらの設定を返すカタログビュー。
SELECT
name,
is_ansi_nulls_on,
is_ansi_null_default_on
FROM sys.databases
ORDER BY name ASC;