SET ANSI_NULLS (Transact-SQL)SET ANSI_NULLS (Transact-SQL)

適用対象: ○SQL Server (2008 以降) XAzure SQL Database ○Azure SQL Data Warehouse ○Parallel Data Warehouse APPLIES TO: yesSQL Server (starting with 2008) noAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

SQL Server 2017SQL Server 2017 で = (等号) 比較演算子と <> (不等号) 比較演算子を NULL 値に対して使用した場合の ISO 準拠動作を指定します。Specifies ISO compliant behavior of the Equals (=) and Not Equal To (<>) comparison operators when they are used with null values in SQL Server 2017SQL Server 2017.

重要

SQL ServerSQL Server の今後のバージョンでは、ANSI_NULLS が ON になり、このオプションを明示的に OFF に設定するすべてのアプリケーションでエラーが発生します。In a future version of SQL ServerSQL Server, ANSI_NULLS will be ON and any applications that explicitly set the option to OFF will generate an error. 新規の開発作業ではこの機能を使用しないようにし、現在この機能を使用しているアプリケーションは修正することを検討してください。Avoid using this feature in new development work, and plan to modify applications that currently use this feature.

トピック リンク アイコン Transact-SQL 構文表記規則Topic link icon Transact-SQL Syntax Conventions

構文Syntax

-- Syntax for SQL Server

SET ANSI_NULLS { ON | OFF }
-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse

SET ANSI_NULLS ON

RemarksRemarks

SET ANSI_NULLS が ON の場合、WHERE column_name = NULL を使用する SELECT ステートメントを実行すると、column_name に NULL 値が指定されていても、0 行が返されます。When SET ANSI_NULLS is ON, a SELECT statement that uses WHERE column_name = NULL returns zero rows even if there are null values in column_name. WHERE column_name <> NULL を使用する SELECT ステートメントでは、column_name に NULL 以外の値が指定されていても、0 行が返されます。A SELECT statement that uses WHERE column_name <> NULL returns zero rows even if there are nonnull values in column_name.

SET ANSI_NULLS が OFF の場合は、= (等号) 比較演算および <> (不等号) 比較演算の実行結果に、ISO 標準が適用されません。When SET ANSI_NULLS is OFF, the Equals (=) and Not Equal To (<>) comparison operators do not follow the ISO standard. WHERE column_name = NULL を使用する SELECT ステートメントでは、column_name に NULL 値を持つ行が返されます。A SELECT statement that uses WHERE column_name = NULL returns the rows that have null values in column_name. WHERE column_name <> NULL を使用する SELECT ステートメントでは、列に NULL 以外の値を持つ行が返されます。A SELECT statement that uses WHERE column_name <> NULL returns the rows that have nonnull values in the column. また、WHERE column_name <> XYZ_value を使用する SELECT ステートメントでは、XYZ_value 以外の非 NULL 値を持つすべての行が返されます。Also, a SELECT statement that uses WHERE column_name <> XYZ_value returns all rows that are not XYZ_value and that are not NULL.

SET ANSI_NULLS が ON に設定されていると、NULL 値に対するすべての比較は UNKNOWN に評価されます。When SET ANSI_NULLS is ON, all comparisons against a null value evaluate to UNKNOWN. SET ANSI_NULLS が OFF に設定されていて、データ値が NULL の場合は、NULL 値に対するすべてのデータ比較は TRUE に評価されます。When SET ANSI_NULLS is OFF, comparisons of all data against a null value evaluate to TRUE if the data value is NULL. SET ANSI_NULLS が指定されていない場合は、現在のデータベースの ANSI_NULLS オプションの設定が適用されます。If SET ANSI_NULLS is not specified, the setting of the ANSI_NULLS option of the current database applies. ANSI_NULLS データベース オプションについて詳しくは、「ALTER DATABASE (Transact-SQL)」を参照してください。For more information about the ANSI_NULLS database option, see ALTER DATABASE (Transact-SQL).

次の表は、ANSI_NULLS の設定が null 値と非 null 値を利用したさまざまなブール式の結果に影響を与えるしくみを示しています。The following table shows how the setting of ANSI_NULLS affects the results of a number of Boolean expressions using null and non-null values.

ブール式Boolean Expression SET ANSI_NULLS ONSET ANSI_NULLS ON SET ANSI_NULLS OFFSET ANSI_NULLS OFF
NULL = NULLNULL = NULL UNKNOWNUNKNOWN TRUETRUE
1 = NULL1 = NULL UNKNOWNUNKNOWN FALSEFALSE
NULL <> NULLNULL <> NULL UNKNOWNUNKNOWN FALSEFALSE
1 <> NULL1 <> NULL UNKNOWNUNKNOWN TRUETRUE
NULL > NULLNULL > NULL UNKNOWNUNKNOWN UNKNOWNUNKNOWN
1 > NULL1 > NULL UNKNOWNUNKNOWN UNKNOWNUNKNOWN
NULL IS NULLNULL IS NULL TRUETRUE TRUETRUE
1 IS NULL1 IS NULL FALSEFALSE FALSEFALSE
NULL IS NOT NULLNULL IS NOT NULL FALSEFALSE FALSEFALSE
1 IS NOT NULL1 IS NOT NULL TRUETRUE TRUETRUE

比較のオペランドの 1 つが NULL またはリテラル NULL のいずれかの変数であるとき、SET ANSI_NULLS が ON の場合のみ比較に影響します。SET ANSI_NULLS ON affects a comparison only if one of the operands of the comparison is either a variable that is NULL or a literal NULL. 比較の両側が列または複合式の場合は、この設定は比較に影響しません。If both sides of the comparison are columns or compound expressions, the setting does not affect the comparison.

スクリプトが意図どおりに動作するようにするには、ANSI_NULLS データベース オプションや SET ANSI_NULLS の設定とは無関係に、NULL 値を含む可能性のある比較で、IS NULL と IS NOT NULL を使用するようにしてください。For a script to work as intended, regardless of the ANSI_NULLS database option or the setting of SET ANSI_NULLS, use IS NULL and IS NOT NULL in comparisons that might contain null values.

分散クエリを実行する際には、SET ANSI_NULLS を ON に設定してください。SET ANSI_NULLS should be set to ON for executing distributed queries.

計算列やインデックス付きビューのインデックスを作成または変更するときには、SET ANSI_NULLS を ON に設定する必要があります。SET ANSI_NULLS must also be ON when you are creating or changing indexes on computed columns or indexed views. SET ANSI_NULLS が OFF の場合、計算列にインデックスが設定されているテーブルやインデックス付きビューにおける CREATE、UPDATE、INSERT、および DELETE のステートメントはいずれも失敗します。If SET ANSI_NULLS is OFF, any CREATE, UPDATE, INSERT, and DELETE statements on tables with indexes on computed columns or indexed views will fail. SQL ServerSQL Server では、要求された値に違反するすべての SET オプションを一覧表示するエラーが返されます。 returns an error that lists all SET options that violate the required values. また、SELECT ステートメントの実行時に SET ANSI_NULLS が OFF の場合、 SQL ServerSQL Server は計算列やビュー上のインデックス値を無視し、テーブルやビューにそのようなインデックスがないものとして SELECT 操作を処理します。Also, when you execute a SELECT statement, if SET ANSI_NULLS is OFF, SQL ServerSQL Server ignores the index values on computed columns or views and resolve the select operation as if there were no such indexes on the tables or views.

注意

ANSI_NULLS は、計算列およびインデックス付きビューにおいてインデックスを操作するときに、指定された値に設定する必要がある 7 つの SET オプションの中の 1 つです。ANSI_NULLS is one of seven SET options that must be set to required values when dealing with indexes on computed columns or indexed views. オプションの ANSI_PADDING、ANSI_WARNINGS、ARITHABORT、QUOTED_IDENTIFIER、および CONCAT_NULL_YIELDS_NULL も ON に設定する必要があります。また、NUMERIC_ROUNDABORT は OFF に設定する必要があります。The options ANSI_PADDING, ANSI_WARNINGS, ARITHABORT, QUOTED_IDENTIFIER, and CONCAT_NULL_YIELDS_NULL must also be set to ON, and NUMERIC_ROUNDABORT must be set to OFF.

SQL ServerSQL Server Native Client ODBC ドライバーおよび SQL ServerSQL Server Native Client OLE DB Provider for SQL ServerSQL Server では、接続時に自動的に ANSI_NULLS が ON に設定されます。The SQL ServerSQL Server Native Client ODBC driver and SQL ServerSQL Server Native Client OLE DB Provider for SQL ServerSQL Server automatically set ANSI_NULLS to ON when connecting. この設定は、ODBC データ ソースまたは ODBC 接続属性で構成でき、 SQL ServerSQL Server のインスタンスに接続する前にアプリケーションの内部で設定される OLE DB 接続プロパティでも構成できます。This setting can be configured in ODBC data sources, in ODBC connection attributes, or in OLE DB connection properties that are set in the application before connecting to an instance of SQL ServerSQL Server. SET ANSI_NULLS の既定値は OFF です。The default for SET ANSI_NULLS is OFF.

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

SET ANSI_NULLS は、解析時ではなく実行時に設定されます。The setting of SET ANSI_NULLS is set at execute or run time and not at parse time.

この設定の現在の設定を表示するには、次のクエリを実行します。To view the current setting for this setting, run the following query:

DECLARE @ANSI_NULLS VARCHAR(3) = 'OFF';  
IF ( (32 & @@OPTIONS) = 32 ) SET @ANSI_NULLS = 'ON';  
SELECT @ANSI_NULLS AS ANSI_NULLS;  

アクセス許可Permissions

public ロールのメンバーシップが必要です。Requires membership in the public role.

使用例Examples

次の例では、= (等号) 比較演算子と <> (不等号) 比較演算子を使用して、テーブル内の NULL 値と NULL 以外の値を比較します。The following example uses the Equals (=) and Not Equal To (<>) comparison operators to make comparisons with NULL and nonnull values in a table. 例は IS NULLSET ANSI_NULLS 設定に影響されないことも示しています。The example also shows that IS NULL is not affected by the SET ANSI_NULLS setting.

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

-- Print message and perform SELECT statements.  
PRINT 'Testing default setting';  
DECLARE @varname int;   
SET @varname = NULL;  

SELECT a  
FROM t1   
WHERE a = @varname;  

SELECT a   
FROM t1   
WHERE a <> @varname;  

SELECT a   
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;  
SET @varname = NULL  

SELECT a   
FROM t1   
WHERE a = @varname;  

SELECT a   
FROM t1   
WHERE a <> @varname;  

SELECT a   
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;  
SET @varname = NULL;  
SELECT a   
FROM t1   
WHERE a = @varname;  

SELECT a   
FROM t1   
WHERE a <> @varname;  

SELECT a   
FROM t1   
WHERE a IS NULL;  
GO  

-- Drop table t1.  
DROP TABLE dbo.t1;  

参照See Also

SET ステートメント (Transact-SQL) SET Statements (Transact-SQL)
SESSIONPROPERTY (Transact-SQL) SESSIONPROPERTY (Transact-SQL)
= (等号) (Transact-SQL) = (Equals) (Transact-SQL)
IF...ELSE (Transact-SQL) IF...ELSE (Transact-SQL)
<> (不等号) (Transact-SQL) <> (Not Equal To) (Transact-SQL)
SET ステートメント (Transact-SQL) SET Statements (Transact-SQL)
SET ANSI_DEFAULTS (Transact-SQL) SET ANSI_DEFAULTS (Transact-SQL)
WHERE (Transact-SQL) WHERE (Transact-SQL)
WHILE (Transact-SQL)WHILE (Transact-SQL)