SET ANSI_NULLS (Transact-SQL)

= (等号) 比較演算子と <> (不等号) 比較演算子を NULL 値に対して使用した場合の SQL-92 準拠動作を指定します。

ms188048.note(ja-jp,SQL.90).gif重要 :
この機能は、将来のバージョンの Microsoft SQL Server では削除される予定です。新規の開発作業ではこの機能を使用しないようにし、現在この機能を使用しているアプリケーションは修正することを検討してください。

トピック リンク アイコンTransact-SQL 構文表記規則

構文

 SET ANSI_NULLS { ON | OFF }

解説

SET ANSI_NULLS が ON の場合、WHERE column_name = NULL を指定した SELECT ステートメントを実行すると、column_name に NULL 値が格納されていても、0 行が返されます。WHERE column_name <> NULL を指定した SELECT ステートメントでは、column_name に NULL 以外の値が格納されていても、0 行が返されます。

SET ANSI_NULLS が OFF の場合は、= (等号) 比較演算および <> (不等号) 比較演算の実行結果に、SQL-92 標準が適用されません。WHERE column_name = NULL を指定した SELECT ステートメントでは、column_name 列に NULL 値を持つ行が返されます。WHERE column_name <> NULL を指定した SELECT ステートメントでは、指定の列に非 NULL 値を持つ行が返されます。また、WHERE column_name <> XYZ_value を指定した SELECT ステートメントでは、指定の列に XYZ_value 以外の非 NULL 値を持つすべての行が返されます。

ms188048.note(ja-jp,SQL.90).gifメモ :
SQL Server が、空の文字列を 1 つの空白文字と解釈するか、または実際の空文字列と解釈するかは、互換性レベルの設定によって決まります。互換性レベルが 65 以下の場合は、SQL Server は空文字列を 1 つのスペースとして解釈します。互換性レベルが 70 の場合は、SQL Server は空文字列を空文字列と解釈します。互換性レベルの設定の詳細については、「sp_dbcmptlevel (Transact-SQL)」を参照してください。

SET ANSI_NULLS が ON に設定されていると、NULL 値に対するすべての比較は UNKNOWN に評価されます。SET ANSI_NULLS が OFF に設定されていて、データ値が NULL の場合は、NULL 値に対するすべてのデータ比較は TRUE に評価されます。SET ANSI_NULLS が指定されていない場合は、現在のデータベースの ANSI_NULLS オプションの設定が適用されます。ANSI_NULLS データベース オプションの詳細については、「ALTER DATABASE (Transact-SQL)」および「データベース オプションの設定」を参照してください。

比較のオペランドの 1 つが NULL またはリテラル NULL のいずれかの変数であるとき、SET ANSI_NULLS が ON の場合のみ比較に影響します。比較の両側が列または複合式の場合は、この設定は比較に影響しません。

スクリプトが意図どおりに動作するようにするには、ANSI_NULLS データベース オプションや SET ANSI_NULLS の設定とは無関係に、NULL 値を含む可能性のある比較で、IS NULL と IS NOT NULL を使用するようにしてください。

分散クエリを実行する際には、SET ANSI_NULLS を ON に設定してください。

計算列やインデックス付きビューのインデックスを作成または変更するときには、SET ANSI_NULLS を ON に設定する必要があります。SET ANSI_NULLS が OFF の場合、計算列にインデックスが設定されているテーブルやインデックス付きビューにおける CREATE、UPDATE、INSERT、および DELETE のステートメントはいずれも失敗します。SQL Server から、目的の値に違反しているすべての SET オプションを一覧表示したエラーが返されます。また、SELECT ステートメントの実行時に SET ANSI_NULLS が OFF の場合、SQL Server は計算列やビュー上のインデックス値を無視し、テーブルやビューにそのようなインデックスがないものとして SELECT 操作を処理します。

ms188048.note(ja-jp,SQL.90).gifメモ :
ANSI_NULLS は、計算列およびインデックス付きビューにおいてインデックスを操作するときに、指定された値に設定する必要がある 7 つの SET オプションの中の 1 つです。オプションの ANSI_PADDING、ANSI_WARNINGS、ARITHABORT、QUOTED_IDENTIFIER、および CONCAT_NULL_YIELDS_NULL も ON に設定する必要があります。また、NUMERIC_ROUNDABORT は OFF に設定する必要があります。

SQL Native Client ODBC ドライバおよび SQL Native Client OLE DB Provider for SQL Server では、接続時に自動的に ANSI_NULLS が ON に設定されます。この設定は、ODBC データ ソースまたは ODBC 接続属性で構成でき、SQL Server のインスタンスに接続する前にアプリケーションの内部で設定される OLE DB 接続プロパティでも構成できます。SET ANSI_NULLS の既定値は OFF です。

SET ANSI_DEFAULTS が ON の場合には、SET ANSI_NULLS は有効 (ON) になります。

SET ANSI_NULLS は、解析時ではなく実行時に設定されます。

権限

public ロールのメンバシップが必要です。

次の例では、= (等号) 比較演算子と <> (不等号) 比較演算子を使用して、テーブル内の NULL 値と NULL 以外の値を比較します。この例では、IS NULLSET ANSI_NULLS の設定に影響されないことも示しています。

-- Create table t1 and insert values.
CREATE TABLE t1 (a INT NULL)
INSERT INTO t1 values (NULL)
INSERT INTO t1 values (0)
INSERT INTO t1 values (1)
GO

-- Print message and perform SELECT statements.
PRINT 'Testing default setting'
DECLARE @varname int
SELECT @varname = NULL
SELECT * 
FROM t1 
WHERE a = @varname
SELECT * 
FROM t1 
WHERE a <> @varname
SELECT * 
FROM t1 
WHERE a IS NULL
GO

-- SET ANSI_NULLS to ON and test.
PRINT 'Testing ANSI_NULLS ON'
SET ANSI_NULLS ON
GO
DECLARE @varname int
SELECT @varname = NULL
SELECT * 
FROM t1 
WHERE a = @varname
SELECT * 
FROM t1 
WHERE a <> @varname
SELECT * 
FROM t1 
WHERE a IS NULL
GO

-- SET ANSI_NULLS to OFF and test.
PRINT 'Testing SET ANSI_NULLS OFF'
SET ANSI_NULLS OFF
GO
DECLARE @varname int
SELECT @varname = NULL
SELECT * 
FROM t1 
WHERE a = @varname
SELECT * 
FROM t1 
WHERE a <> @varname
SELECT * 
FROM t1 
WHERE a IS NULL
GO

-- Drop table t1.
DROP TABLE t1

参照

関連項目

SET (Transact-SQL)
SESSIONPROPERTY (Transact-SQL)
= (等しい) (Transact-SQL)
IF...ELSE (Transact-SQL)
<> (等しくない) (Transact-SQL)
SET (Transact-SQL)
SET ANSI_DEFAULTS (Transact-SQL)
WHERE (Transact-SQL)
WHILE (Transact-SQL)

ヘルプおよび情報

SQL Server 2005 の参考資料の入手