SET ANSI_NULLS (Transact-SQL)
Задает совместимое со стандартом SQL-92 поведение операторов сравнения «равно» (=) и «не равно» (<>) при использовании со значениями NULL.
Важно! |
---|
В будущей версии Microsoft SQL Server эта возможность будет удалена. Избегайте использования этой возможности в новых разработках и запланируйте изменение существующих приложений, в которых она применяется. |
Соглашения о синтаксисе в Transact-SQL
Синтаксис
SET ANSI_NULLS { ON | OFF }
Замечания
Если SET ANSI_NULLS установлено в ON, любая инструкция SELECT, использующая предложение WHERE column_name = NULL, не вернет ни одной записи, даже если в столбце column_name есть значения NULL. Любая инструкция SELECT, использующая предложение WHERE column_name <> NULL, не вернет ни одной записи, даже если в столбце column_name есть значения, не равные NULL.
Если SET ANSI_NULLS установлено в OFF, операторы «равно» (=) и «не равно» (<>) не следуют стандарту SQL-92. Любая инструкция SELECT, использующая предложение WHERE column_name = NULL, возвращает все записи со значениями NULL в столбце column_name. Любая инструкция SELECT, использующая предложение WHERE column_name <> NULL, возвращает все записи со значениями столбца, не равными NULL. Также любая инструкция SELECT, использующая предложение WHERE column_name <> XYZ_value, возвращает все записи со значениями столбца, не равными XYZ_value и не равными NULL.
Примечание. |
---|
SQL Server интерпретирует пустую строку как один пробел или действительно пустую строку в зависимости от настройки уровня совместимости. Если уровень совместимости меньше или равен 65, SQL Server представляет пустые строки как одиночные пробелы. Если уровень совместимости равен 70, SQL Server представляет пустые строки как пустые строки. Дополнительные сведения об установке уровня совместимости см. в разделе sp_dbcmptlevel (Transact-SQL). |
Если SET ANSI_NULLS равняется ON, все сравнения со значением NULL возвращают значение UNKNOWN. Когда SET ANSI_NULLS равняется OFF, сравнение любых значений с NULL вернет TRUE только в том случае, если сравниваемое значение тоже NULL. Если параметр SET ANSI_NULLS не указан, применяется значение параметра ANSI_NULLS текущей базы данных. Дополнительные сведения о параметре базы данных ANSI_NULLS см. в разделах ALTER DATABASE (Transact-SQL) и Установка параметров базы данных.
Директива SET ANSI_NULLS ON влияет только на сравнения, в которых в качестве одного из операндов используется NULL в виде переменной или литеральной константы. Если оба операнда представляют собой столбцы или составные выражения, эта настройка не влияет на результат сравнения.
Чтобы сценарий работал в соответствии с первоначальным замыслом, вне зависимости от настроек базы данных ANSI NULLS или использования директивы SET ANSI_NULLS, следует использовать выражения IS NULL и IS NOT NULL для сравнений, операнды которых могут содержать значения 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 не обрабатывает значения индексов вычисляемых столбцов или представлений и произведет выборку, словно этих индексов не существовало.
Примечание. |
---|
ANSI_NULLS является одним из семи параметров директивы SET, которые должны быть установлены определенным образом при работе с вычисляемыми столбцами или индексированными представлениями. Параметры ANSI_PADDING, ANSI_WARNINGS, ARITHABORT, QUOTED_IDENTIFIER и CONCAT_NULL_YIELDS_NULL должны иметь значение ON, а параметр NUMERIC_ROUNDABORT — значение OFF. |
Драйвер ODBC и поставщик OLE DB собственного клиента SQL Server автоматически устанавливают параметру ANSI_NULLS значение ON при соединении. Этот параметр может быть настроен в источниках данных ODBC, в атрибутах соединения ODBC или свойствах соединения OLE DB, установленных в приложении перед подключением к экземпляру SQL Server. По умолчанию значение SET ANSI_NULLS равно OFF.
Когда параметр SET ANSI_DEFAULTS имеет значение ON, режим SET ANSI_NULLS включен.
Установка значения SET ANSI_NULLS происходит во время запуска или выполнения, но не во время синтаксического анализа.
Разрешения
Необходимо членство в роли public.
Примеры
Следующий пример иллюстрирует использование операторов «равно» (=
) и «не равно» (<>
) для сравнения со значениями NULL
и не-NULL в таблице. Этот пример также демонстрирует, что использование конструкции IS NULL
не зависит от значения параметра SET 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)