Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
S’applique à :SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Spécifie le comportement conforme ISO des opérateurs de comparaison Equals (=
) et Not Equal To (<>
) lorsqu’ils sont utilisés avec NULL
des valeurs dans SQL Server.
-
SET ANSI_NULLS ON
- Évalue les deux{expression} = NULL
et{expression} <> NULL
commeFalse
si la valeur de l’objet{expression}
estNULL
. Ce comportement est conforme à ANSI. -
SET ANSI_NULLS OFF
- Évalue{expression} = NULL
commeTrue
False
{expression} <> NULL
si la valeur est .{expression}
NULL
Ce comportement n’est pas recommandé, car les valeurs ne doivent pas être comparées à l’utilisationNULL
=
et<>
aux opérateurs.
Remarque
SET ANSI_NULLS OFF
et l’option ANSI_NULLS OFF
de base de données est déconseillée. À compter de SQL Server 2017 (14.x), ANSI_NULLS est toujours défini sur ON. Les fonctionnalités dépréciées ne doivent pas être utilisées dans de nouvelles applications. Pour plus d’informations, consultez Fonctionnalités de Moteur de base de données déconseillées dans SQL Server 2017.
Conventions de la syntaxe Transact-SQL
Syntaxe
Syntaxe pour SQL Server et Pool SQL serverless dans Azure Synapse Analytics, Microsoft Fabric
SET ANSI_NULLS { ON | OFF }
Syntaxe pour Azure Synapse Analytics et Analytics Platform System (PDW)
SET ANSI_NULLS ON
Notes
Lorsqu’il ANSI_NULLS
s’agit de ON, une SELECT
instruction qui utilise WHERE column_name = NULL
retourne zéro ligne, même s’il existe des valeurs NULL dans column_name. Une SELECT
instruction qui utilise WHERE column_name <> NULL
retourne zéro ligne même s’il existe des valeurs non NULL dans column_name.
Lorsque ANSI_NULLS est OFF, les opérateurs de comparaison Equals (=
) et Not Equal To (<>
) ne suivent pas la norme ISO. Une SELECT
instruction qui utilise WHERE column_name = NULL
retourne les lignes qui ont des valeurs null dans column_name. Une SELECT
instruction qui utilise WHERE column_name <> NULL
retourne les lignes qui n’ont pas deNULL
valeurs dans la colonne. En outre, une SELECT
instruction qui utilise WHERE column_name <> XYZ_value
retourne toutes les lignes qui ne sont pas XYZ_value et qui ne sont pas NULL
.
Lorsqu’il ANSI_NULLS
s’agit de ON, toutes les comparaisons par rapport à une valeur Null sont évaluées à UNKNOWN. Quand SET ANSI_NULLS
est DÉSACTIVÉ, les comparaisons de toutes les données par rapport à une valeur Null ont la valeur TRUE si la valeur de données est NULL
. S’il SET ANSI_NULLS
n’est pas spécifié, le paramètre de l’option ANSI_NULLS
de la base de données active s’applique. Pour plus d’informations sur l’option ANSI_NULLS
de base de données, consultez ALTER DATABASE (Transact-SQL).
Le tableau suivant montre comment le paramètre affecte ANSI_NULLS
les résultats des expressions booléennes à l’aide de valeurs null et non null.
Expression booléenne | SET ANSI_NULLS ON | SET ANSI_NULLS OFF |
---|---|---|
NULL = NULL |
INCONNU | true |
1 = NULL |
INCONNU | FAUX |
NULL <> NULL |
INCONNU | FAUX |
1 <> NULL |
INCONNU | true |
NULL > NULL |
INCONNU | INCONNU |
1 > NULL |
INCONNU | INCONNU |
NULL IS NULL |
true | true |
1 IS NULL |
FAUX | FAUX |
NULL IS NOT NULL |
FAUX | FAUX |
1 IS NOT NULL |
true | true |
SET ANSI_NULLS ON
affecte une comparaison uniquement si l’un des opérandes de la comparaison est une variable qui est NULL
ou un littéral NULL
. Si les deux termes de la comparaison sont des colonnes ou des expressions composées, le paramètre n'a pas d'incidence sur la comparaison.
Pour qu’un script fonctionne comme prévu, quelle que soit l’option ANSI_NULLS
de base de données ou le paramètre , SET ANSI_NULLS
utilisez IS NULL
et IS NOT NULL
dans des comparaisons qui peuvent contenir des valeurs Null.
ANSI_NULLS
doit être défini sur ON pour l’exécution de requêtes distribuées.
ANSI_NULLS
doit également être ACTIVÉ lorsque vous créez ou modifiez des index sur des colonnes calculées ou des vues indexées. Si SET ANSI_NULLS est OFF, any CREATE
, UPDATE
, INSERT
, et DELETE
instructions on tables with indexes on computed columns or indexed views fail. SQL Server génère une erreur qui répertorie toutes les options SET non conformes aux valeurs requises. En outre, lorsque vous exécutez une SELECT
instruction, si SET ANSI_NULLS
elle est OFF, SQL Server ignore les valeurs d’index sur les colonnes ou les vues calculées et résout l’opération de sélection comme s’il n’y avait pas d’index de ce type sur les tables ou les vues.
Remarque
ANSI_NULLS
est l’une des sept options SET qui doivent être définies sur les valeurs requises lors du traitement des index sur des colonnes calculées ou des vues indexées. Les options ANSI_PADDING
, ANSI_WARNINGS
, ARITHABORT
, QUOTED_IDENTIFIER
et CONCAT_NULL_YIELDS_NULL
doivent également être définies sur ON, et NUMERIC_ROUNDABORT
doit être définie sur OFF.
Le pilote ODBC SQL Server Native Client et le fournisseur OLE DB SQL Server Native Client pour SQL Server sont automatiquement définis ANSI_NULLS
sur ON lors de la connexion. Cette valeur peut être configurée dans les sources de données ou les attributs de connexion ODBC, ainsi que dans les propriétés de connexion OLE DB définies dans l'application avant la connexion à une instance de SQL Server. La valeur par défaut SET ANSI_NULLS
est OFF.
Quand ANSI_DEFAULTS
on est ACTIVÉ, ANSI_NULLS
est activé.
Le paramètre est défini au moment de ANSI_NULLS
l’exécution ou de l’exécution et non au moment de l’analyse.
Pour afficher la valeur actuelle de ce paramètre, exécutez la requête suivante :
DECLARE @ANSI_NULLS VARCHAR(3) = 'OFF';
IF ( (32 & @@OPTIONS) = 32 ) SET @ANSI_NULLS = 'ON';
SELECT @ANSI_NULLS AS ANSI_NULLS;
Autorisations
Nécessite l'appartenance au rôle public .
Exemples
L’exemple suivant utilise les opérateurs de comparaison Equals (=
) et Not Equal To (<>
) pour effectuer des comparaisons avec NULL
ou 0
avec la null
valeur d’une 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
Les résultats sont affichés dans le tableau suivant.
EqualNull | DifferentNull | EqualZero | DifferentZero |
---|---|---|---|
Vrai | Faux | Faux | Vrai |
Toutes SET ANSI_NULLS ON
les expressions sont évaluées comme « False », car NULL
elles ne peuvent pas être comparées à NULL
ces opérateurs ou 0
en utilisant ces opérateurs.
L'exemple ci-dessous utilise les opérateurs de comparaison Égal à (=
) et Différent de (<>
) pour effectuer une comparaison avec des valeurs NULL
et non NULL dans une table. L’exemple montre également que le paramètre n’affecte SET ANSI_NULLS
IS NULL
pas .
-- 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
Définissez à présent ANSI_NULLS avec la valeur ON et effectuez un 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
Définissez à présent ANSI_NULLS avec la valeur OFF et effectuez un 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;