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

SI APPLICA A: sìSQL Server noDatabase SQL di Azure sìAzure SQL Data Warehouse sìParallel Data Warehouse APPLIES TO: yesSQL Server noAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

Specifica il comportamento conforme allo standard ISO degli operatori di confronto Uguale a (=) e Diverso da (<>) quando vengono usati con valori Null in 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

In una versione futura di SQL ServerSQL Server ANSI_NULLS sarà impostata su ON e qualsiasi applicazione che imposta tale opzione in modo esplicito su OFF genererà un errore.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. Evitare di usare questa funzionalità in un nuovo progetto di sviluppo e prevedere interventi di modifica nelle applicazioni in cui è attualmente implementata.Avoid using this feature in new development work, and plan to modify applications that currently use this feature.

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintassiSyntax

-- Syntax for SQL Server

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

SET ANSI_NULLS ON

RemarksRemarks

Quando l'opzione ANSI_NULLS è impostata su ON, un'istruzione SELECT che usa WHERE column_name = NULL non restituisce alcuna riga anche se column_name include valori 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. Un'istruzione SELECT che usa WHERE column_name <> NULL non restituisce alcuna riga anche se column_name include valori non Null.A SELECT statement that uses WHERE column_name <> NULL returns zero rows even if there are nonnull values in column_name.

Quando l'opzione ANSI_NULLS è impostata su OFF, gli operatori uguale a (=) e diverso da (<>) non seguono lo standard ISO.When ANSI_NULLS is OFF, the Equals (=) and Not Equal To (<>) comparison operators do not follow the ISO standard. Un'istruzione SELECT che usa WHERE column_name = NULL restituisce le righe con valori Null in column_name.A SELECT statement that uses WHERE column_name = NULL returns the rows that have null values in column_name. Un'istruzione SELECT che usa WHERE column_name <> NULL restituisce le righe con valori non Null nella colonna.A SELECT statement that uses WHERE column_name <> NULL returns the rows that have nonnull values in the column. Inoltre un'istruzione SELECT che usa WHERE column_name <> XYZ_value restituisce tutte le righe che non sono XYZ_value e non sono 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.

Quando l'opzione ANSI_NULLS è impostata su ON, tutti i confronti con un valore Null restituiscono UNKNOWN.When ANSI_NULLS is ON, all comparisons against a null value evaluate to UNKNOWN. Quando l'opzione SET ANSI_NULLS è impostata su OFF, i confronti di tutti i dati con un valore Null restituiscono TRUE se il valore dei dati è NULL.When SET ANSI_NULLS is OFF, comparisons of all data against a null value evaluate to TRUE if the data value is NULL. In caso di omissione di SET ANSI_NULLS, viene applicata l'impostazione dell'opzione ANSI_NULLS del database corrente.If SET ANSI_NULLS is not specified, the setting of the ANSI_NULLS option of the current database applies. Per altre informazioni sull'opzione di database ANSI_NULLS, vedere ALTER DATABASE (Transact-SQL).For more information about the ANSI_NULLS database option, see ALTER DATABASE (Transact-SQL).

La tabella seguente illustra come l'impostazione di ANSI_NULLS influisce sui risultati di un certo numero di espressioni booleane che usano valori NULL e non 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.

Espressione 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 influisce su un confronto solo se uno degli operandi del confronto è una variabile NULL o un valore letterale 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. Se entrambi gli operandi del confronto sono colonne o espressioni composte, l'impostazione non ha effetto sul confronto.If both sides of the comparison are columns or compound expressions, the setting does not affect the comparison.

Affinché uno script presenti il funzionamento previsto indipendentemente dall'opzione di database ANSI_NULLS o dall'impostazione di SET ANSI_NULLS, utilizzare IS NULL e IS NOT NULL nei confronti che potrebbero includere valori 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.

Per l'esecuzione di query distribuite, è necessario impostare l'opzione ANSI_NULLS su ON.ANSI_NULLS should be set to ON for executing distributed queries.

È necessario che l'opzione ANSI_NULLS sia impostata su ON anche per la creazione o la modifica di indici su colonne calcolate o viste indicizzate.ANSI_NULLS must also be ON when you are creating or changing indexes on computed columns or indexed views. Se l'opzione SET ANSI_NULLS è impostata su OFF, qualsiasi istruzione CREATE, UPDATE, INSERT e DELETE eseguita in tabelle con indici su colonne calcolate o viste indicizzate avrà esito negativo.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 restituisce un errore in cui sono elencate tutte le opzioni SET che violano i valori obbligatori.returns an error that lists all SET options that violate the required values. Se inoltre l'opzione SET ANSI_NULLS è impostata su OFF durante l'esecuzione di un'istruzione SELECT, SQL ServerSQL Server ignora i valori di indice delle colonne calcolate o delle viste e l'operazione di selezione viene risolta come se le tabelle o le viste non includessero tali indici.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 è una delle sette opzioni SET che è necessario impostare sui valori richiesti quando si utilizzano colonne calcolate o viste indicizzate.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. Anche le opzioni ANSI_PADDING, ANSI_WARNINGS, ARITHABORT, QUOTED_IDENTIFIER e CONCAT_NULL_YIELDS_NULL devono essere impostate su ON e NUMERIC_ROUNDABORT deve essere impostata su 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.

Il driver ODBC SQL ServerSQL Server Native Client e il provider OLE DB SQL ServerSQL Server Native Client per SQL ServerSQL Server impostano automaticamente l'opzione ANSI_DEFAULTS su ON al momento della connessione.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. È possibile configurare questa impostazione nelle origini dei dati ODBC, negli attributi di connessione ODBC o nelle proprietà di connessione OLE DB impostate nell'applicazione prima della connessione a un'istanza di 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. Il valore predefinito per SET ANSI_NULLS è OFF.The default for SET ANSI_NULLS is OFF.

Quando l'opzione ANSI_DEFAULTS è impostata su ON, l'opzione ANSI_NULLS è abilitata.When ANSI_DEFAULTS is ON, ANSI_NULLS is enabled.

L'opzione ANSI_NULLS viene definita in fase di esecuzione, non in fase di analisi.The setting of ANSI_NULLS is defined at execute or run time and not at parse time.

Per visualizzare l'impostazione corrente per questa impostazione, eseguire la query riportata di seguito: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;   

AutorizzazioniPermissions

È richiesta l'appartenenza al ruolo public .Requires membership in the public role.

EsempiExamples

Nell'esempio seguente vengono usati gli operatori di confronto Uguale a (=) e Diverso da (<>) per confrontare i valori NULL e non Null in una tabella.The following example uses the Equals (=) and Not Equal To (<>) comparison operators to make comparisons with NULL and non-null values in a table. L'esempio evidenzia anche il fatto che l'impostazione dell'opzione SET ANSI_NULLS non influisce su IS NULL.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 

Impostare ora ANSI_DEFAULTS su ON e testare.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  

Impostare ora ANSI_DEFAULTS su OFF e testare.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;  

Vedere ancheSee Also

Istruzioni SET (Transact-SQL) SET Statements (Transact-SQL)
SESSIONPROPERTY (Transact-SQL) SESSIONPROPERTY (Transact-SQL)
= (Equals) (Transact-SQL) = (Equals) (Transact-SQL)
IF...ELSE (Transact-SQL) IF...ELSE (Transact-SQL)
<> (Not Equal To) (Transact-SQL) <> (Not Equal To) (Transact-SQL)
Istruzioni 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)