SET ANSI_WARNINGS (Transact-SQL)

Spécifie le comportement conforme à la norme ISO pour plusieurs conditions d'erreur :

Icône Lien de rubriqueConventions de la syntaxe de Transact-SQL

Syntaxe

SET ANSI_WARNINGS { ON | OFF }

Notes

SET ANSI_WARNINGS a une incidence sur les conditions suivantes :

  • Lorsque la valeur est définie à ON et que des valeurs NULL figurent dans des fonctions d'agrégation (par exemple, SUM, AVG, MAX, MIN, STDEV, STDEVP, VAR, VARP ou COUNT), un message d'avertissement est généré. Lorsque la valeur est définie à OFF, aucun avertissement n'est émis.

  • Lorsque la valeur est définie à ON, les erreurs de division par zéro et de dépassement de capacité arithmétique provoquent l'annulation de l'instruction et l'émission d'un message d'erreur. Lorsque la valeur est définie à OFF, les erreurs de division par zéro et de dépassement arithmétique entraînent le renvoi de valeurs NULL. Une erreur de division par zéro ou de dépassement de capacité arithmétique provoque le renvoi de valeurs NULL si une instruction INSERT ou UPDATE est tentée sur une colonne de type character, Unicode ou binary contenant une nouvelle valeur dont la longueur est supérieure à la taille maximale de la colonne. Conformément à la norme ISO, si l'option SET ANSI_WARNINGS est activée, l'opération INSERT ou UPDATE est annulée. Les espaces blancs sont ignorés dans des colonnes de type caractère et les zéros sont ignorés dans les colonnes de type binaire. Lorsque la valeur est définie à OFF, les données sont tronquées de façon à correspondre à la taille de la colonne, et l'instruction s'exécute correctement.

    [!REMARQUE]

    Lorsque la troncature se produit au cours d'une conversion à partir de ou vers des données de type binary ou varbinary, aucun message d'avertissement ou d'erreur n'est émis, quelles que soient les options SET.

    [!REMARQUE]

    L'option ANSI_WARNINGS n'est pas reconnue lors d'une transmission de paramètres dans une procédure stockée ou dans une fonction définie par l'utilisateur, ou bien lors de la déclaration et de la définition de variables dans une instruction de traitement. Par exemple, si une variable de type char(3) est définie avec une valeur contenant plus de trois caractères, les données sont tronquées pour se conformer à la taille spécifiée et les instructions INSERT ou UPDATE s'exécutent correctement.

L'option user options de la procédure stockée sp_configure peut servir à définir la valeur par défaut de ANSI_WARNINGS pour toutes les connexions au serveur. Pour plus d'informations, consultez sp_configure (Transact-SQL) ou Définition des options de configuration de serveur.

L'option SET ANSI_WARNINGS doit être activée (valeur ON) lors de la création ou de la manipulation d'index dans des colonnes calculées ou des vues indexées. Si SET ANSI_WARNINGS est désactivé (OFF), les instructions CREATE, UPDATE, INSERT et DELETE dans des tables comportant des index sur des colonnes calculées ou des vues indexées échouent. Pour plus d'informations sur les valeurs requises des options SET dans des vues indexées et des index de colonnes calculées, consultez « Remarques sur l'utilisation des instructions SET » dans la rubrique SET (Transact-SQL).

SQL Server comprend l'option de base de données ANSI_WARNINGS. C'est l'équivalent de SET ANSI_WARNINGS. Lorsque SET ANSI_WARNINGS est défini à ON, des erreurs ou des avertissements sont générés dans le cas d'une division par zéro, d'une chaîne trop longue pour la colonne de la base de données, ou de toute autre erreur similaire. Lorsque SET ANSI_WARNINGS est défini à OFF, ces erreurs et avertissements ne sont pas générés. La valeur par défaut de SET ANSI_WARNINGS dans la base de données model est définie à OFF. Si elle n'est pas spécifiée, la valeur de ANSI_WARNINGS s'applique. Si l'option SET ANSI_WARNINGS est définie à OFF, SQL Server utilise la valeur de la colonne is_ansi_warnings_on dans la vue de catalogue sys.databases. Pour plus d'informations, consultez Définition des options de base de données.

La valeur de ANSI_WARNINGS doit être définie à ON lors de l'exécution de requêtes distribuées.

Le pilote ODBC SQL Server Native Client et le fournisseur OLE DB SQL Server Native Client pour SQL Server affectent automatiquement la valeur ON à ANSI_WARNINGS lors de la connexion. Cette option peut être configurée dans les sources de données et les attributs de connexion ODBC, ou encore dans les propriétés de connexion OLE DB définies dans l'application avant la connexion. La valeur par défaut pour SET ANSI_WARNINGS est OFF lorsqu'il s'agit de connexions à partir d'applications de bibliothèques de bases de données.

Lorsque SET ANSI_DEFAULTS est défini à ON, l'option SET ANSI_WARNINGS est activée.

L'option SET ANSI_WARNINGS est appliquée lors de l'exécution, et non pas lors de l'analyse.

Si la valeur de SET ARITHABORT ou de SET ARITHIGNORE est définie à OFF et que SET ANSI_WARNINGS a la valeur ON, SQL Server renvoie malgré tout un message d'erreur quand il rencontre une erreur de division par zéro ou de dépassement de capacité.

Autorisations

Nécessite l'appartenance au rôle public.

Exemple

L'exemple suivant illustre les trois cas mentionnés plus haut, avec SET ANSI_WARNINGS prenant la valeur ON ou OFF.

USE AdventureWorks;
GO

CREATE TABLE T1 (
   a INT, 
   b INT NULL, 
   c VARCHAR(20)
);
GO

SET NOCOUNT ON

INSERT INTO T1 
VALUES (1, NULL, '');
INSERT INTO T1 
VALUES (1, 0, '');
INSERT INTO T1 
VALUES (2, 1, '');
INSERT INTO T1 
VALUES (2, 2, '');

SET NOCOUNT OFF;
GO
  
PRINT '**** Setting ANSI_WARNINGS ON';
GO
  
SET ANSI_WARNINGS ON;
GO
  
PRINT 'Testing NULL in aggregate';
GO
SELECT a, SUM(b) 
FROM T1 
GROUP BY a;
GO
  
PRINT 'Testing String Overflow in INSERT';
GO
INSERT INTO T1 
VALUES (3, 3, 'Text string longer than 20 characters');
GO
  
PRINT 'Testing Divide by zero';
GO
SELECT a / b AS ab 
FROM T1;
GO
  
PRINT '**** Setting ANSI_WARNINGS OFF';
GO
SET ANSI_WARNINGS OFF;
GO
  
PRINT 'Testing NULL in aggregate';
GO
SELECT a, SUM(b) 
FROM T1 
GROUP BY a;
GO
  
PRINT 'Testing String Overflow in INSERT';
GO
INSERT INTO T1 
VALUES (4, 4, 'Text string longer than 20 characters');
GO
SELECT a, b, c 
FROM T1
WHERE a = 4;
GO

PRINT 'Testing Divide by zero';
GO
SELECT a / b AS ab 
FROM T1;
GO

DROP TABLE T1