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;