SET ANSI_WARNINGS (Transact-SQL)

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

Icône Lien de rubrique Conventions 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'un passage 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 par lot. Par exemple, si une variable est définie en tant que char(3) et qu'une valeur comprenant plus de trois caractères lui est affectée, les données sont tronquées au niveau de la taille définie et l'instruction INSERT ou UPDATE réussit.

L'option user options de 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).

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 paramètres d'option SET requis dans des vues indexées et des index sur des colonnes calculées, consultez « Remarques sur l'utilisation des instructions SET » dans Instructions 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 OFF. Si elle n'est pas spécifiée, la valeur de ANSI_WARNINGS s'applique. Si SET ANSI_WARNINGS a la valeur OFF, SQL Server utilise la valeur de la colonne is_ansi_warnings_on dans l'affichage catalogue sys.databases.

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, définis 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 SET ARITHABORT ou SET ARITHIGNORE a la valeur OFF et que SET ANSI_WARNINGS a la valeur ON, SQL Server retourne néanmoins un message d'erreur lorsqu'il rencontre une erreur de division par zéro ou de dépassement de capacité.

Autorisations

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

Exemples

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

USE AdventureWorks2012;
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

Voir aussi

Référence

INSERT (Transact-SQL)

SELECT (Transact-SQL)

Instructions SET (Transact-SQL)

SET ANSI_DEFAULTS (Transact-SQL)

SESSIONPROPERTY (Transact-SQL)