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

SE APLICA A: síSQL Server (a partir de 2008) noAzure SQL Database síAzure SQL Data Warehouse síAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server (starting with 2008) noAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

Especifica el comportamiento conforme a ISO de los operadores de comparación Es igual a (=) y No es igual a (<>) cuando se usan con valores NULL en SQL Server 2017SQL Server 2017.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.

Importante

En una versión futura de SQL ServerSQL Server, ANSI_NULLS estará establecido en ON y cualquier aplicación que establezca de forma explícita la opción en OFF generará un error.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. Evite utilizar esta característica en nuevos trabajos de desarrollo y tenga previsto modificar las aplicaciones que actualmente la utilizan.Avoid using this feature in new development work, and plan to modify applications that currently use this feature.

Icono de vínculo de tema Convenciones de sintaxis de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxisSyntax

-- Syntax for SQL Server

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

SET ANSI_NULLS ON

NotasRemarks

Cuando ANSI_NULLS se establece en ON, una instrucción SELECT que usa WHERE nombre_columna = NULL devuelve cero filas aunque haya valores NULL en nombre_columna.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. Una instrucción SELECT que usa WHERE column_name <> NULL devuelve cero filas aunque haya valores que no sean NULL en column_name.A SELECT statement that uses WHERE column_name <> NULL returns zero rows even if there are nonnull values in column_name.

Cuando ANSI_NULLS se establece en OFF, los operadores de comparación Es igual a (=) y No es igual a (<>) no siguen el estándar ISO.When ANSI_NULLS is OFF, the Equals (=) and Not Equal To (<>) comparison operators do not follow the ISO standard. Una instrucción SELECT que usa WHERE column_name = NULL devuelve las filas que tienen valores NULL en column_name.A SELECT statement that uses WHERE column_name = NULL returns the rows that have null values in column_name. Una instrucción SELECT que usa WHERE column_name <> NULL devuelve las filas que tienen valores no NULL en la columna.A SELECT statement that uses WHERE column_name <> NULL returns the rows that have nonnull values in the column. Además, una instrucción SELECT que usa WHERE column_name <> XYZ_value devuelve todas las filas que no son XYZ_value y que no son 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.

Cuando ANSI_NULLS es ON, todas las comparaciones con un valor NULL se evalúan como UNKNOWN.When ANSI_NULLS is ON, all comparisons against a null value evaluate to UNKNOWN. Cuando SET ANSI_NULLS es OFF, la comparación de cualquier dato con un valor NULL se evalúa como TRUE si el valor del dato es NULL.When SET ANSI_NULLS is OFF, comparisons of all data against a null value evaluate to TRUE if the data value is NULL. Si no se especifica SET ANSI_NULLS, se aplica el valor de la opción de base de datos ANSI_NULLS.If SET ANSI_NULLS is not specified, the setting of the ANSI_NULLS option of the current database applies. Para más información sobre la opción de base de datos ANSI_NULLS, vea ALTER DATABASE (Transact-SQL).For more information about the ANSI_NULLS database option, see ALTER DATABASE (Transact-SQL).

En la tabla siguiente se muestra cómo el valor de ANSI_NULLS afecta a los resultados de una serie de expresiones booleanas con valores NULL y no 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.

Expresión booleanaBoolean 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 solo afecta a una comparación si uno de los operandos es una variable que es NULL o un NULL literal.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. Si ambos lados de la comparación son columnas o expresiones compuestas, la configuración no afecta a la comparación.If both sides of the comparison are columns or compound expressions, the setting does not affect the comparison.

Para que un script funcione como se pretende, independientemente de la opción de base de datos ANSI_NULLS o de la opción SET ANSI_NULLS, use IS NULL e IS NOT NULL en las comparaciones que puedan contener valores 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 se debe establecer en ON para ejecutar consultas distribuidas.ANSI_NULLS should be set to ON for executing distributed queries.

Igualmente se debe establecer en ON al crear o cambiar índices en columnas calculadas o vistas indexadas.ANSI_NULLS must also be ON when you are creating or changing indexes on computed columns or indexed views. Si SET ANSI_NULLS es OFF, las instrucciones CREATE, UPDATE, INSERT y DELETE producirán errores en tablas con índices en columnas calculadas y vistas indizadas.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 devuelve un error que muestra todas las opciones SET que infringen los valores necesarios.returns an error that lists all SET options that violate the required values. Además, al ejecutar una instrucción SELECT, si SET ANSI_NULLS es OFF, SQL ServerSQL Server omite los valores de índice en vistas o columnas calculadas y resuelve la operación de selección como si no hubiera tales índices en las tablas o vistas.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.

Nota

ANSI_NULLS es una de las siete opciones SET a las que se deben asignar unos valores requeridos para tratar índices en columnas calculadas o vistas indizadas.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. 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.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.

El controlador ODBC de SQL ServerSQL Server Native Client y el proveedor OLE DB de SQL ServerSQL Server Native Client para SQL ServerSQL Server establecen automáticamente ANSI_NULLS en ON al conectarse.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. 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 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. El valor predeterminado de SET ANSI_NULLS es OFF.The default for SET ANSI_NULLS is OFF.

Cuando ANSI_DEFAULTS es ON, se habilita ANSI_WARNINGS.When ANSI_DEFAULTS is ON, ANSI_NULLS is enabled.

El valor de ANSI_NULLS se define en tiempo de ejecución, no en tiempo de análisis.The setting of ANSI_NULLS is defined at execute or run time and not at parse time.

Para ver la configuración actual de este valor, ejecute la siguiente consulta: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;   

PermisosPermissions

Debe pertenecer al rol public .Requires membership in the public role.

EjemplosExamples

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.The following example uses the Equals (=) and Not Equal To (<>) comparison operators to make comparisons with NULL and non-null values in a table. En este ejemplo también se muestra que IS NULL no se ve afectado por el valor 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 

Ahora, establezca ANSI_NULLS en ON y pruebe.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  

Ahora, establezca ANSI_NULLS en OFF y pruebe.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;  

Consulte tambiénSee Also

Instrucciones SET (Transact-SQL) SET Statements (Transact-SQL)
SESSIONPROPERTY (Transact-SQL) SESSIONPROPERTY (Transact-SQL)
= (Igual a) (Transact-SQL) = (Equals) (Transact-SQL)
IF...ELSE (Transact-SQL) IF...ELSE (Transact-SQL)
<> (No es igual a) (Transact-SQL) <> (Not Equal To) (Transact-SQL)
Instrucciones 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)