Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Aplica a:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Sistema de Plataforma de Analítica (PDW)
Base de datos SQL en Microsoft Fabric
Especifica el comportamiento compatible con ISO de los operadores de comparación Equals (=) y Not Equal To (<>) cuando se usan con NULL valores en SQL Server.
-
SET ANSI_NULLS ON: evalúa y{expression} = NULL{expression} <> NULLcomoFalsesi el valor de{expression}esNULL. Este comportamiento es compatible con ANSI. -
SET ANSI_NULLS OFF- Evalúa como y como si el valor de{expression} = NULLesTrue.{expression} <> NULLFalse{expression}NULLEste comportamiento no se recomienda, ya que losNULLvalores no deben compararse mediante=operadores y<>.
Nota:
SET ANSI_NULLS OFF y la ANSI_NULLS OFF opción de base de datos están en desuso. A partir de SQL Server 2017 (14.x), ANSI_NULLS siempre se establece en ACTIVADO. Las características en desuso no se deben usar en nuevas aplicaciones. Para obtener más información, vea Características de Motor de base de datos en desuso en SQL Server 2017.
Convenciones de sintaxis de Transact-SQL
Sintaxis
Sintaxis de SQL Server y un grupo de SQL sin servidor en Azure Synapse Analytics, Microsoft Fabric
SET ANSI_NULLS { ON | OFF }
Sintaxis para Azure Synapse Analytics y Sistema de la plataforma de análisis (PDW)
SET ANSI_NULLS ON
Comentarios
Cuando ANSI_NULLS es ON, una SELECT instrucción que usa WHERE column_name = NULL devuelve cero filas incluso si hay valores NULL en column_name. Una SELECT instrucción que usa WHERE column_name <> NULL devuelve cero filas incluso si hay valores que no son NULL en column_name.
Cuando ANSI_NULLS es OFF, los operadores de comparación Equals (=) y Not Equal To (<>) no siguen el estándar ISO. Una SELECT instrucción que usa WHERE column_name = NULL devuelve las filas que tienen valores NULL en column_name. Una SELECT instrucción que usa WHERE column_name <> NULL devuelve las filas que tienen valores que noNULL son de la columna. Además, una SELECT instrucción que usa WHERE column_name <> XYZ_value devuelve todas las filas que no están XYZ_value y que no NULLson .
Cuando ANSI_NULLS es ON, todas las comparaciones con un valor NULL se evalúan como UNKNOWN. Cuando SET ANSI_NULLS es OFF, las comparaciones de todos los datos con un valor NULL se evalúan como TRUE si el valor de los datos es NULL. Si SET ANSI_NULLS no se especifica, se aplica el valor de la ANSI_NULLS opción de la base de datos actual. Para obtener más información sobre la ANSI_NULLS opción de base de datos, vea ALTER DATABASE (Transact-SQL).
En la tabla siguiente se muestra cómo la configuración de ANSI_NULLS afecta a los resultados de las expresiones booleanas mediante valores NULL y no NULL.
| Expresión booleana | PONER ANSI_NULLS ENCENDIDO | DESCONECTAR ANSI_NULLS |
|---|---|---|
NULL = NULL |
DESCONOCIDO | true |
1 = NULL |
DESCONOCIDO | FALSO |
NULL <> NULL |
DESCONOCIDO | FALSO |
1 <> NULL |
DESCONOCIDO | true |
NULL > NULL |
DESCONOCIDO | DESCONOCIDO |
1 > NULL |
DESCONOCIDO | DESCONOCIDO |
NULL IS NULL |
true | true |
1 IS NULL |
FALSO | FALSO |
NULL IS NOT NULL |
FALSO | FALSO |
1 IS NOT NULL |
true | true |
SET ANSI_NULLS ON afecta a una comparación solo si uno de los operandos de la comparación es una variable que es NULL o un literal NULL. Si ambos lados de la comparación son columnas o expresiones compuestas, la configuración no afecta a la comparación.
Para que un script funcione según lo previsto, independientemente de la ANSI_NULLS opción de base de datos o del valor de SET ANSI_NULLS, use IS NULL y IS NOT NULL en comparaciones que puedan contener valores NULL.
ANSI_NULLS debe establecerse en ON para ejecutar consultas distribuidas.
ANSI_NULLS también debe estar activado al crear o cambiar índices en columnas calculadas o vistas indizadas. Si SET ANSI_NULLS es OFF, se produce un error en las CREATEinstrucciones , UPDATE, INSERTy DELETE en tablas con índices en columnas calculadas o vistas indizadas. SQL Server devuelve un error que muestra todas las opciones SET que infringen los valores necesarios. Además, al ejecutar una SELECT instrucción, si SET ANSI_NULLS es OFF, SQL Server omite los valores de índice en las columnas o vistas calculadas y resuelve la operación de selección como si no hubiera dichos índices en las tablas o vistas.
Nota:
ANSI_NULLS es una de las siete opciones SET que se deben establecer en valores necesarios al tratar con índices en columnas calculadas o vistas indizadas. Las opciones ANSI_PADDING, ANSI_WARNINGS, ARITHABORT, QUOTED_IDENTIFIER, y CONCAT_NULL_YIELDS_NULL también se deben establecer en ON, y NUMERIC_ROUNDABORT en OFF.
El controlador ODBC de SQL Server Native Client y el proveedor OLE DB de SQL Server Native Client para SQL Server se establecen ANSI_NULLS automáticamente en ON al conectarse. Esta opción se puede configurar en los orígenes de datos ODBC, en los atributos de conexión ODBC o en las propiedades de conexión OLE DB establecidas en la aplicación antes de conectarse a una instancia de SQL Server. El valor predeterminado de SET ANSI_NULLS es OFF.
Cuando ANSI_DEFAULTS está activado, ANSI_NULLS está habilitado.
La configuración de se define en tiempo de ANSI_NULLS ejecución o ejecución y no en tiempo de análisis.
Para ver la configuración actual de este valor, ejecute la siguiente consulta:
DECLARE @ANSI_NULLS VARCHAR(3) = 'OFF';
IF ( (32 & @@OPTIONS) = 32 ) SET @ANSI_NULLS = 'ON';
SELECT @ANSI_NULLS AS ANSI_NULLS;
Permisos
Debe pertenecer al rol public .
Ejemplos
En el ejemplo siguiente se usan los operadores de comparación Equals (=) y Not Equal To (<>) para realizar comparaciones con NULL o 0 y el null valor de una variable.
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
Los resultados se muestran en la tabla siguiente.
| EqualNull | DifferentNull | EqualZero (Igual a Cero) | DifferentZero (DiferenteCero) |
|---|---|---|---|
| Cierto | Falso | Falso | Cierto |
Con SET ANSI_NULLS ON todas las expresiones se evaluaría como "False" porque NULL no se puede comparar con NULL estos operadores ni 0 usarlos.
En el ejemplo siguiente se usan los operadores de comparación Es igual a (=) y No es igual a (<>) para realizar comparaciones con valores NULL y distintos de NULL en una tabla. En el ejemplo también se muestra que la SET ANSI_NULLS configuración no afecta a 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
Ahora, establezca ANSI_NULLS en ON y pruebe.
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
Ahora, establezca ANSI_NULLS en OFF y pruebe.
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;