Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a:Banco de Dados SQL do
Azure
Instância Gerenciada de SQL do Azure
Azure Synapse Analytics
Analytics Platform System (PDW)
Banco de Dados SQL no Microsoft Fabric
Especifica o comportamento compatível com ISO dos operadores de comparação Igual (=) e Não Igual a (<>) quando eles são usados com NULL valores no SQL Server.
-
SET ANSI_NULLS ON- Avalia ambos{expression} = NULLe{expression} <> NULLcomoFalsese o valor de{expression}fosseNULL. Esse comportamento é compatível com ANSI. -
SET ANSI_NULLS OFF- Avalia como e como se o valor de{expression} = NULLéTrue.{expression} <> NULLFalse{expression}NULLEsse comportamento não é recomendado, porque osNULLvalores não devem ser comparados usando=e<>operadores.
Observação
SET ANSI_NULLS OFF e a ANSI_NULLS OFF opção de banco de dados foram preteridas. A partir do SQL Server 2017 (14.x), ANSI_NULLS é sempre definido como ATIVADO. Recursos preteridos não devem ser usados em novos aplicativos. Para obter mais informações, consulte Recursos preteridos do Mecanismo de Banco de Dados no SQL Server 2017.
Transact-SQL convenções de sintaxe
Sintaxe
Sintaxe para SQL Server, pool SQL sem servidor no Azure Synapse Analytics, Microsoft Fabric
SET ANSI_NULLS { ON | OFF }
Sintaxe do Azure Synapse Analytics and Analytics Platform System (PDW)
SET ANSI_NULLS ON
Observações
Quando ANSI_NULLS está ON, uma SELECT instrução que usa WHERE column_name = NULL retorna zero linhas mesmo se houver valores NULL em column_name. Uma SELECT instrução que usa WHERE column_name <> NULL retorna linhas zero mesmo se houver valores não-NULL em column_name.
Quando ANSI_NULLS está DESATIVADO, os operadores de comparação Igual (=) e Não Igual a (<>) não seguem o padrão ISO. Uma SELECT instrução que usa WHERE column_name = NULL retorna as linhas que têm valores nulos em column_name. Uma SELECT instrução que usa WHERE column_name <> NULL retorna as linhas que não têmNULL valores na coluna. Além disso, uma SELECT instrução que usa WHERE column_name <> XYZ_value retorna todas as linhas que não são XYZ_value e que não NULLsão .
Quando ANSI_NULLS está ON, todas as comparações com um valor nulo são avaliadas como UNKNOWN. Quando SET ANSI_NULLS é OFF, as comparações de todos os dados com um valor nulo são avaliadas como TRUE se o valor dos dados for NULL. Se SET ANSI_NULLS não for especificado, aplica-se a ANSI_NULLS configuração da opção do banco de dados atual. Para obter mais informações sobre a ANSI_NULLS opção de banco de dados, consulte ALTER DATABASE (Transact-SQL).
A tabela a seguir mostra como a configuração de ANSI_NULLS afeta os resultados de expressões booleanas usando valores nulos e não nulos.
| Expressão Booleana | DEFINIR ANSI_NULLS EM | INICIAR ANSI_NULLS |
|---|---|---|
NULL = NULL |
DESCONHECIDO | VERDADEIRO |
1 = NULL |
DESCONHECIDO | FALSO |
NULL <> NULL |
DESCONHECIDO | FALSO |
1 <> NULL |
DESCONHECIDO | VERDADEIRO |
NULL > NULL |
DESCONHECIDO | DESCONHECIDO |
1 > NULL |
DESCONHECIDO | DESCONHECIDO |
NULL IS NULL |
VERDADEIRO | VERDADEIRO |
1 IS NULL |
FALSO | FALSO |
NULL IS NOT NULL |
FALSO | FALSO |
1 IS NOT NULL |
VERDADEIRO | VERDADEIRO |
SET ANSI_NULLS ON afeta uma comparação somente se um dos operandos da comparação for uma variável ou NULL um literal NULL. Se ambos os lados da comparação forem colunas ou expressões compostas, a configuração não afetará a comparação.
Para que um script funcione como pretendido, independentemente da opção de banco de dados ou da ANSI_NULLS configuração de SET ANSI_NULLS, use IS NULL e IS NOT NULL em comparações que possam conter valores nulos.
ANSI_NULLS deve ser definido como ON para executar consultas distribuídas.
ANSI_NULLS também deve estar ATIVADO quando você estiver criando ou alterando índices em colunas computadas ou exibições indexadas. Se SET ANSI_NULLS estiver OFF, qualquer CREATEinstrução , UPDATEINSERT, e DELETE em tabelas com índices em colunas computadas ou exibições indexadas falhará. O SQL Server retorna um erro que lista todas as opções SET que violam os valores necessários. Além disso, quando você executa uma SELECT instrução, se SET ANSI_NULLS estiver OFF, o SQL Server ignora os valores de índice em colunas ou exibições computadas e resolve a operação select como se não houvesse tais índices nas tabelas ou exibições.
Observação
ANSI_NULLS é uma das sete opções SET que devem ser definidas como valores necessários ao lidar com índices em colunas computadas ou exibições indexadas. As opções ANSI_PADDING, ANSI_WARNINGS, ARITHABORT, QUOTED_IDENTIFIER, e CONCAT_NULL_YIELDS_NULL também devem ser definidas como ON e NUMERIC_ROUNDABORT devem ser definidas como OFF.
O driver ODBC do SQL Server Native Client e o provedor OLE DB do SQL Server Native Client para SQL Server são ANSI_NULLS definidos automaticamente como ON ao se conectar. Essa configuração pode ser definida em fontes de dados ODBC, em atributos de conexão ODBC ou em propriedades de conexão OLE DB definidas no aplicativo antes de se conectar a uma instância do SQL Server. O padrão para SET ANSI_NULLS é OFF.
Quando ANSI_DEFAULTS está ATIVADO, ANSI_NULLS está ativado.
A configuração de é definida em tempo de execução ou execução e não em tempo de ANSI_NULLS análise.
Para exibir a configuração atual para essa configuração, execute a seguinte consulta:
DECLARE @ANSI_NULLS VARCHAR(3) = 'OFF';
IF ( (32 & @@OPTIONS) = 32 ) SET @ANSI_NULLS = 'ON';
SELECT @ANSI_NULLS AS ANSI_NULLS;
Permissões
Requer adesão à função pública de .
Exemplos
O exemplo a seguir usa os operadores de comparação Equals (=) e Not Equal To (<>) para fazer comparações com NULL ou 0 e o null valor em uma variável.
SET ANSI_NULLS OFF
DECLARE @var INT = NULL
SELECT
IIF(@var = NULL, 'True', 'False') as EqualNull,
IIF(@var <> NULL, 'True', 'False') as DifferentNull,
IIF(@var = 0, 'True', 'False') as EqualZero,
IIF(@var <> 0, 'True', 'False') as DifferentZero
Os resultados são apresentados na tabela seguinte.
| EqualNull | DifferentNull | EqualZero | DiferenteZero |
|---|---|---|---|
| Verdade | Falso | Falso | Verdade |
Com SET ANSI_NULLS ON todas as expressões seria avaliado como 'Falso' porque NULL não pode ser comparado com NULL ou 0 usando esses operadores.
O exemplo a seguir usa os operadores de comparação Equals (=) e Not Equal To (<>) para fazer comparações com NULL e valores não nulos em uma tabela. O exemplo também mostra que a configuração não afeta SET ANSI_NULLSo IS NULL .
-- 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
Agora defina ANSI_NULLS para ON e teste.
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
Agora defina ANSI_NULLS para OFF e teste.
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;