SET ANSI_WARNINGS (Transact-SQL)

S’applique à : SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) SQL analytics endpoint in Microsoft Fabric Warehouse in Microsoft Fabric

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

Conventions de la syntaxe Transact-SQL

Syntaxe

Syntaxe pour SQL Server et Pool SQL serverless dans Azure Synapse Analytics, Microsoft Fabric

SET ANSI_WARNINGS { ON | OFF }

Syntaxe pour Azure Synapse Analytics et Analytics Platform System (PDW)

SET ANSI_WARNINGS ON

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 arithmétique provoque le retour de valeurs NULL si une opération 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 (valeur ON), 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.

Notes

Quand 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.

Notes

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 comme char(3) , puis réglée sur une valeur supérieure à trois caractères, les données sont tronquées à la taille définie et l’instruction INSERT ou UPDATE réussit.

Vous pouvez utiliser l’option options utilisateur de sp_configure définir le paramètre par défaut pour ANSI_WARNINGS pour toutes les connexions au serveur. Pour plus d’informations, consultez sp_configure (Transact-SQL).

ANSI_WARNINGS doit être activé (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 de l’option SET obligatoire avec les affichages indexés et les 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 dans la model base de données pour SET ANSI_WARNINGS est OFF. Si elle n'est pas spécifiée, la valeur de ANSI_WARNINGS s'applique. Si l’option SET ANSI_WARNINGS est OFF, SQL Server utilise la valeur de la colonne is_ansi_warnings_on dans la vue de catalogue sys.databases.

Important

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

Les clients, tels que le pilote ODBC client natif SQL Server, le fournisseur OLE DB client natif SQL Server pour SQL Server et le pilote Microsoft JDBC pour SQL Server définissent automatiquement ANSI_WARNINGS sur ON avec un indicateur de 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. Pour plus d’informations, consultez LOGIN7 dans les spécifications du protocole TDS (Tabular Data Stream).

Quand ANSI_DEFAULTS est ON, ANSI_WARNINGS est activé.

La valeur d’ANSI_WARNINGS est définie au moment de l’exécution, pas au moment de l’analyse. Comme toutes les instructions SET, SET ANSI_WARNINGS affecte la session active.

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é.

Pour afficher la valeur actuelle de ce paramètre, exécutez la requête suivante.

DECLARE @ANSI_WARN VARCHAR(3) = 'OFF';  
IF ( (8 & @@OPTIONS) = 8 ) SET @ANSI_WARN = 'ON';  
SELECT @ANSI_WARN AS ANSI_WARNINGS;  

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.

CREATE TABLE T1   
(  
   a int,   
   b int NULL,   
   c varchar(20)  
);  
GO  
  
SET NOCOUNT ON;  
  
INSERT INTO T1   
VALUES (1, NULL, '')   
      ,(1, 0, '')  
      ,(2, 1, '')  
      ,(2, 2, '');  
  
SET NOCOUNT OFF;  
GO  

Définissez à présent ANSI_WARNINGS avec la valeur ON et effectuez un test.

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  

Définissez à présent ANSI_WARNINGS avec la valeur OFF et effectuez un test.

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;