Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SQL Server ANSI_NULLS expliqué

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 un NULL la valeur est évaluée à UNKNOWN .
  • Lorsqu'il est réglé sur OFF , comparaisons de valeurs non-Unicode à un NULL valeur évaluée à TRUE si les deux valeurs sont NULL .

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;