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

Применимо к:Applies to: даSQL ServerSQL Server (все поддерживаемые версии) yesSQL ServerSQL Server (all supported versions) ДаБаза данных SQL AzureAzure SQL DatabaseYesБаза данных SQL AzureAzure SQL Database ДаУправляемый экземпляр SQL AzureAzure SQL Managed InstanceYesУправляемый экземпляр SQL AzureAzure SQL Managed Instance даAzure Synapse AnalyticsAzure Synapse AnalyticsyesAzure Synapse AnalyticsAzure Synapse Analytics даПараллельное хранилище данныхParallel Data WarehouseyesПараллельное хранилище данныхParallel Data WarehouseПрименимо к:Applies to: даSQL ServerSQL Server (все поддерживаемые версии) yesSQL ServerSQL Server (all supported versions) ДаБаза данных SQL AzureAzure SQL DatabaseYesБаза данных SQL AzureAzure SQL Database ДаУправляемый экземпляр SQL AzureAzure SQL Managed InstanceYesУправляемый экземпляр SQL AzureAzure SQL Managed Instance даAzure Synapse AnalyticsAzure Synapse AnalyticsyesAzure Synapse AnalyticsAzure Synapse Analytics даПараллельное хранилище данныхParallel Data WarehouseyesПараллельное хранилище данныхParallel Data Warehouse

Задает совместимое со стандартом ISO поведение операторов сравнения "равно" (=) и "не равно" (<>) при их использовании со значениями NULL в SQL Server 2019 (15.x)SQL Server 2019 (15.x).Specifies ISO compliant behavior of the Equals (=) and Not Equal To (<>) comparison operators when they are used with null values in SQL Server 2019 (15.x)SQL Server 2019 (15.x).

Значок ссылки на раздел Синтаксические обозначения в Transact-SQLTopic 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

Примечание

Ссылки на описание синтаксиса Transact-SQL для SQL Server 2014 и более ранних версий, см. в статье Документация по предыдущим версиям.To view Transact-SQL syntax for SQL Server 2014 and earlier, see Previous versions documentation.

RemarksRemarks

Если параметру ANSI_NULLS присвоено значение ON, инструкция SELECT, использующая предложение WHERE имя_столбца = NULL, не вернет ни одной строки, даже если в столбце имя_столбца есть значения NULL.When 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. Инструкция SELECT, использующая предложение WHERE column_name <> NULL, не вернет ни одной строки, даже если в столбце column_name есть значения, отличные от NULL.A SELECT statement that uses WHERE column_name <> NULL returns zero rows even if there are nonnull values in column_name.

Если параметр ANSI_NULLS имеет значение OFF, операторы "равно" (=) и "не равно" (<>) не следуют стандарту ISO.When ANSI_NULLS is OFF, the Equals (=) and Not Equal To (<>) comparison operators do not follow the ISO standard. Инструкция SELECT, использующая предложение WHERE column_name = NULL, вернет строки, имеющие значения NULL, в столбце column_name.A SELECT statement that uses WHERE column_name = NULL returns the rows that have null values in column_name. Инструкция SELECT, использующая предложение WHERE column_name <> NULL, вернет строки, имеющие значения, отличные от NULL, в столбце.A SELECT statement that uses WHERE column_name <> NULL returns the rows that have nonnull values in the column. Также любая инструкция SELECT, использующая предложение WHERE column_name <> XYZ_value, возвращает все строки со значениями, не равными 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.

Если параметр ANSI_NULLS равен ON, все сравнения со значением NULL возвращают значение UNKNOWN.When ANSI_NULLS is ON, all comparisons against a null value evaluate to UNKNOWN. Когда SET ANSI_NULLS равняется OFF, сравнение любых значений с NULL вернет TRUE только в том случае, если сравниваемое значение тоже NULL.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

Директива SET ANSI_NULLS ON влияет только на сравнения, в которых в качестве одного из операндов используется NULL в виде переменной или литеральной константы.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.

Параметр ANSI_NULLS должен иметь значение ON для выполнения распределенных запросов.ANSI_NULLS should be set to ON for executing distributed queries.

Также параметр ANSI_NULLS должен иметь значение ON при создании или изменении индексов вычисляемых столбцов или индексированных представлений.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 не обрабатывает значения индексов вычисляемых столбцов или представлений и произведет выборку, словно этих индексов не существовало.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 является одним из семи параметров директивы SET, которые должны быть установлены определенным образом при работе с вычисляемыми столбцами или индексированными представлениями.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.

При соединении с драйвером ODBC для Native Client SQL ServerSQL Server или поставщика OLE DB для Native Client SQL ServerSQL Server для 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 или свойствах соединения OLE DB, установленных в приложении перед подключением к экземпляру SQL ServerSQL Server.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.

Если параметр ANSI_DEFAULTS установлен в значение ON, параметр ANSI_NULLS также включается.When ANSI_DEFAULTS is ON, ANSI_NULLS is enabled.

Значение ANSI_NULLS определяется во время выполнения, а не во время синтаксического анализа.The setting of ANSI_NULLS is defined 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

В следующем примере операторы сравнения Equals (=) Not Equal To (<>) используются для сравнения со значениями в таблице, которые равны или не равны NULL.The following example uses the Equals (=) and Not Equal To (<>) comparison operators to make comparisons with NULL and non-null values in a table. Этот пример также демонстрирует, что использование конструкции IS NULL не зависит от значения параметра SET 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 

Теперь установите параметр ANSI_NULLS в значение ON и выполните тестирование.Now 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  

Теперь установите параметр ANSI_NULLS в значение OFF и выполните тестирование.Now set ANSI_NULLS to OFF and test.

PRINT 'Testing 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)