Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
S’applique à :SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Point de terminaison d’analytique SQL dans Microsoft Fabric
Entrepôt dans Microsoft Fabric
Base de données SQL dans 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 affecte 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. Le comportement dans lequel une erreur de dépassement par zéro ou arithmétique provoque la restitution de valeurs nulles se produit si un INSERT ou UPDATE est essayé sur un caractère, une colonne Unicode ou binaire dans laquelle la longueur d’une nouvelle valeur dépasse la taille maximale de la colonne. Si SETSET ANSI_WARNINGS est ACTIVÉ, le INSERT ou UPDATE est annulé comme spécifié par la norme ISO. 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
Lorsque la troncature se produit lors de toute conversion vers ou depuis des données binaires ou varbinaires , aucun avertissement ni erreur n’est émis, quelles que soient les SET options.
Notes
ANSI_WARNINGS n’est pas honoré lors du passage de paramètres dans une procédure stockée, une fonction définie par l’utilisateur, ou lors de la déclaration et de la définition de variables dans une instruction batch. Par exemple, si une variable est définie comme char(3) et qu’une valeur de plus de trois caractères lui est attribuée, les données sont tronquées en fonction de la taille définie, et l’instruction INSERT ou UPDATE réussit.
Vous pouvez utiliser l’option options utilisateur pour sp_configure définir le paramètre ANSI_WARNINGS par défaut pour toutes les connexions au serveur. Pour plus d’informations, consultez sp_configure (Transact-SQL).
ANSI_WARNINGS doit être activé lorsque vous créez ou manipulez des index sur des colonnes calculées ou des vues indexées. Si SETSET ANSI_WARNINGS est OFF, CREATE, UPDATE, INSERT, et DELETE les instructions sur des tables avec des index sur des colonnes calculées ou des vues indexées échoueront. Pour plus d’informations sur les paramètres d’options requis SET avec des vues et index indexés sur les colonnes calculées, voir « Considérations lors de l’utilisation des SET instructions » dans SET Instructions (Transact-SQL).
SQL Server inclut l’option ANSI_WARNINGS de base de données. Ceci équivaut à SET ANSI_WARNINGS. Lorsque SET ANSI_WARNINGS c’est activé, des erreurs ou des avertissements apparaissent en division par zéro, une chaîne trop grande pour une colonne de base de données, et d’autres erreurs similaires. Lorsque SET ANSI_WARNINGS l’option est DÉSACTIVÉE, ces erreurs et avertissements ne sont pas affichés. La valeur par défaut dans la model base de données pour SET ANSI_WARNINGS est OFF. Si ce n’est pas spécifié, le réglage de ANSI_WARNINGS s’applique. Si SET ANSI_WARNINGS est OFF, SQL Server utilise la valeur de la colonne is_ansi_warnings_on dans la vue catalogue sys.databases.
Important
ANSI_WARNINGS doit être défini sur ON pour l’exécution de requêtes distribuées.
Des clients, tels que le pilote ODBC du SQL Server Native Client, le fournisseur OLE DB du client natif SQL Server pour SQL Server, et le pilote JDBC Microsoft pour SQL Server sont automatiquement réglés ANSI_WARNINGS sur ON avec un drapeau 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. Le défaut est SET ANSI_WARNINGS DÉSACTIVÉ pour les connexions depuis DB-Library applications. Pour plus d’informations, consultez LOGIN7 dans les spécifications du protocole TDS (Tabular Data Stream).
Quand ANSI_DEFAULTS on est ACTIVÉ, ANSI_WARNINGS est activé.
Le paramètre est défini au moment de ANSI_WARNINGS l’exécution ou de l’exécution et non au moment de l’analyse. Comme toutes SET les déclarations, SET ANSI_WARNINGS cela affecte la session en cours.
Si l’un ouSET ARITHIGNORESETl’autre SET ARITHABORT est DÉSACTIVÉ et SETSET ANSI_WARNINGS est ACTIVÉ, SQL Server renvoie toujours un message d’erreur lors de la rencontre d’erreurs de division par zéro ou de dépassement.
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 situations mentionnées précédemment, avec le SET ANSI_WARNINGS to ON et 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
Maintenant, réglez ANSI_WARNINGS sur ON et testez.
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
Maintenant, réglez ANSI_WARNINGS sur OFF et testez.
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;