Dans SQL Server, le ANSI_NULLS
Le paramètre vous permet de spécifier comment NULL
les valeurs sont traitées dans les requêtes.
Plus précisément, il vous permet de spécifier le comportement conforme ISO des Equals (=
) et Différent de (<>
) opérateurs de comparaison lorsqu'ils sont utilisés avec NULL
valeurs.
ANSI_NULLS
peut être réglé sur ON
ou OFF
. Un NULL
test qui retourne vrai avec ANSI_NULLS OFF
peut en fait renvoyer false avec ANSI_NULLS ON
.
Cela peut être la source de beaucoup de confusion, et il est donc utile de comprendre exactement comment ANSI_NULLS
œuvres.
ANSI_NULLS
les paramètres peuvent être définis au niveau de la base de données et au niveau de la session. Si un ANSI_NULLS
paramètre au niveau de la session n'est pas spécifié, SQL Server utilisera n'importe quel ANSI_NULLS
paramètre est appliqué à la base de données actuelle. Par conséquent, vous pouvez remplacer le paramètre de base de données par votre propre paramètre de niveau de session lors de l'écriture de requêtes ad hoc.
Une chose importante à noter est que le pilote ODBC SQL Server Native Client et le fournisseur OLE DB SQL Server Native Client pour SQL Server définissent automatiquement ANSI_NULLS
sur ON
lors de la connexion. Ce paramètre peut être configuré dans les sources de données ODBC, dans les attributs de connexion ODBC ou dans les propriétés de connexion OLE DB définies dans l'application avant la connexion à une instance de SQL Server.
Comment vérifier le paramètre ANSI_NULLS de votre session
Vous pouvez utiliser le SESSIONPROPERTY()
fonction pour vérifier le ANSI_NULLS
paramètre pour la session en cours.
SELECT SESSIONPROPERTY('ANSI_NULLS');
Résultat :
+--------------------+ | (No column name) | |--------------------| | 1 | +--------------------+
Dans ce cas, le ANSI_NULLS
le paramètre pour ma session est ON
.
Un zéro (0
) signifierait qu'il est désactivé.
Comment modifier le paramètre ANSI_NULLS de votre session
Vous pouvez définir le paramètre ANSI_NULLS de votre session sur OFF
avec le code suivant :
SET ANSI_NULLS OFF;
Une nouvelle vérification produira ensuite un zéro.
SELECT SESSIONPROPERTY('ANSI_NULLS');
Résultat :
+--------------------+ | (No column name) | |--------------------| | 0 | +--------------------+
La valeur par défaut pour SET ANSI_NULLS
est OFF
. Cependant, comme mentionné ci-dessus, le pilote ODBC SQL Server Native Client et le fournisseur OLE DB SQL Server Native Client pour SQL Server définissent automatiquement ANSI_NULLS
sur ON
lors de la connexion.
Exemples de la façon dont ANSI_NULLS
Affecte les requêtes
Voici quelques exemples de base pour illustrer les différents résultats que vous pouvez obtenir, en fonction de la valeur de ANSI_NULLS
réglage.
Ceux-ci utilisent SET ANSI_NULLS
pour basculer le ANSI_NULLS
paramètre pour la session en cours.
ANSI_NULLS ON
SET ANSI_NULLS ON;
SELECT NULL
WHERE NULL = NULL;
Résultat :
(0 rows affected)
Lorsque ANSI_NULLS
est ON
, toutes les comparaisons avec un NULL
la valeur est évaluée à UNKNOWN
.
Dans ce cas, nous ne pouvons pas vraiment dire que NULL
est égal à NULL
car chaque valeur est inconnue.
Par conséquent, aucune ligne n'est renvoyée pour la requête ci-dessus.
ANSI_NULLS OFF
SET ANSI_NULLS OFF;
SELECT NULL
WHERE NULL = NULL;
Résultat :
+--------------------+ | (No column name) | |--------------------| | NULL | +--------------------+
Lorsque ANSI_NULLS
est OFF
, comparaisons de toutes les données avec un NULL
valeur évaluée à TRUE
si la valeur de la donnée est NULL
.
La même logique s'applique lors de l'utilisation de l'opérateur Différent de (<>
).
Développons l'exemple pour inclure l'opérateur Différent de (<>
), ainsi qu'une comparaison entre NULL
et un non-NULL
valeur.
ANSI_NULLS ON
SET ANSI_NULLS ON;
SELECT NULL
WHERE NULL = NULL;
SELECT 'Not NULL'
WHERE NULL <> NULL;
SELECT NULL
WHERE 1 = NULL;
SELECT 'Not NULL'
WHERE 1 <> NULL;
Résultat :
(0 rows affected) (0 rows affected) (0 rows affected) (0 rows affected)
Comme prévu, aucune ligne n'est renvoyée pour aucune des requêtes. C'est parce que NULL
les valeurs sont traitées comme un UNKNOWN
valeur lorsque ANSI_NULLS
est ON
.
ANSI_NULLS OFF
SET ANSI_NULLS OFF;
SELECT NULL
WHERE NULL = NULL;
SELECT 'Not NULL'
WHERE NULL <> NULL;
SELECT NULL
WHERE 1 = NULL;
SELECT 'Not NULL'
WHERE 1 <> NULL;
Résultat :
+--------------------+ | (No column name) | |--------------------| | NULL | +--------------------+ (1 row affected) (0 rows affected) (0 rows affected) +--------------------+ | (No column name) | |--------------------| | Not NULL | +--------------------+ (1 row affected)
Nous obtenons un résultat différent lorsque ANSI_NULLS
est OFF
.
Dans ce cas, SQL Server ne traite pas NULL
comme UNKNOWN
. Il détermine que NULL
est en fait égal à NULL
.
Ceci n'est pas conforme à la norme ANSI.
Le IS NULL
Prédicat
Pour qu'un script fonctionne comme prévu, quel que soit le ANSI_NULLS
option de base de données ou le paramètre de SET ANSI_NULLS
, utilisez IS NULL
et IS NOT NULL
dans les comparaisons pouvant contenir des valeurs nulles
Voici ce qui se passe lorsque nous réécrivons l'exemple précédent pour utiliser IS NULL
et IS NOT NULL
.
ANSI_NULLS ON
SET ANSI_NULLS ON;
SELECT NULL
WHERE NULL IS NULL;
SELECT NULL
WHERE NULL IS NOT NULL;
SELECT 'Not NULL'
WHERE 1 IS NULL;
SELECT 'Not NULL'
WHERE 1 IS NOT NULL;
Résultat :
+--------------------+ | (No column name) | |--------------------| | NULL | +--------------------+ (1 row affected) (0 rows affected) (0 rows affected) +--------------------+ | (No column name) | |--------------------| | Not NULL | +--------------------+ (1 row affected)
ANSI_NULLS OFF
SET ANSI_NULLS OFF;
SELECT NULL
WHERE NULL IS NULL;
SELECT NULL
WHERE NULL IS NOT NULL;
SELECT 'Not NULL'
WHERE 1 IS NULL;
SELECT 'Not NULL'
WHERE 1 IS NOT NULL;
Résultat :
+--------------------+ | (No column name) | |--------------------| | NULL | +--------------------+ (1 row affected) (0 rows affected) (0 rows affected) +--------------------+ | (No column name) | |--------------------| | Not NULL | +--------------------+ (1 row affected)
Comme prévu, nous obtenons le même résultat quel que soit le ANSI_NULLS
réglage.
Tableau comparatif
Le tableau suivant décrit les variations que vous pouvez obtenir en fonction de l'expression booléenne et de ANSI_NULLS
réglage.
Expression booléenne | DÉFINIR ANSI_NULLS SUR | DÉSACTIVER ANSI_NULLS |
---|---|---|
NULL =NULL | INCONNU | VRAI |
1 =NULL | INCONNU | FAUX |
NULL <> NULL | INCONNU | FAUX |
1 <> NULL | INCONNU | VRAI |
NULL> NULL | INCONNU | INCONNU |
1> NUL | INCONNU | INCONNU |
NULL EST NULL | VRAI | VRAI |
1 EST NULL | FAUX | FAUX |
NULL N'EST PAS NULL | FAUX | FAUX |
1 N'EST PAS NULL | VRAI | VRAI |
Définir ANSI_NULLS au niveau de la base de données
Chaque base de données SQL Server a un ANSI_NULLS
paramètre, qui détermine comment les comparaisons avec NULL
les valeurs sont évaluées.
- Lorsqu'il est réglé sur
ON
, comparaisons avec unNULL
la valeur est évaluée àUNKNOWN
. - Lorsqu'il est réglé sur
OFF
, comparaisons de valeurs non-Unicode à unNULL
valeur évaluée àTRUE
si les deux valeurs sontNULL
.
Vous pouvez modifier ce paramètre sur une base de données avec le code suivant :
ALTER DATABASE CURRENT
SET ANSI_NULLS ON;
Cela définit ANSI_NULLS
sur ON
pour la base de données actuelle. Vous pouvez échanger CURRENT
avec le nom d'une base de données si vous préférez.
Vous pouvez vérifier le paramètre actuel avec le DATABASEPROPERTYEX()
fonction.
SELECT DATABASEPROPERTYEX('Music','IsAnsiNullsEnabled');
Résultat :
1
Comme mentionné, vous pouvez remplacer ce paramètre lors de l'écriture de requêtes ad hoc en le définissant au niveau de la session, comme nous l'avons fait précédemment.
Pendant que nous sommes sur le sujet, je dois mentionner que les bases de données SQL Server ont également un ANSI_NULL_DEFAULT
paramètre. Ce paramètre détermine la valeur par défaut, NULL
ou NOT NULL
, d'une colonne ou d'un type CLR défini par l'utilisateur pour lequel la possibilité de valeur nulle n'est pas explicitement définie dans CREATE TABLE
ou ALTER TABLE
déclarations.
Cette valeur peut être définie comme suit :
ALTER DATABASE CURRENT
SET ANSI_NULL_DEFAULT ON;
Sa valeur peut être récupérée comme ceci :
SELECT DATABASEPROPERTYEX('Music','IsAnsiNullDefault');
Résultat :
1
Vous pouvez également utiliser le sys.databases
vue catalogue pour renvoyer ces paramètres pour toutes les bases de données.
SELECT
name,
is_ansi_nulls_on,
is_ansi_null_default_on
FROM sys.databases
ORDER BY name ASC;