SET ANSI_WARNINGS (Transact-SQL)

Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL Analytics-eindpunt in Microsoft FabricMagazijn in Microsoft FabricSQL-database in Microsoft Fabric

Specificeert ISO-standaardgedrag voor verschillende foutcondities.

Transact-SQL syntaxis-conventies

Syntaxis

Syntax for SQL Server, serverless SQL pool in Azure Synapse Analytics, Microsoft Fabric

SET ANSI_WARNINGS { ON | OFF }

Syntaxis voor Azure Synapse Analytics en Analytics Platform System (PDW)

SET ANSI_WARNINGS ON

Opmerkingen

SET ANSI_WARNINGS beïnvloedt de volgende aandoeningen:

  • Wanneer ingesteld op ON, wordt er een waarschuwingsbericht gegenereerd als nullwaarden verschijnen in aggregate functies zoals SUM, AVG, MAX, MIN, STDEV, STDEVP, VAR, VARP of COUNT. Wanneer deze op UIT staat, wordt er geen waarschuwing gegeven.

  • Wanneer deze op ON staat, zorgen de deel-door-nul en rekenkundige overflowfouten ervoor dat de instructie wordt teruggedraaid en wordt er een foutmelding gegenereerd. Wanneer deze op UIT wordt gezet, zorgen de deel-door-nul en rekenkundige overloopfouten ervoor dat nulwaarden worden teruggegeven. Het gedrag waarbij een deel-door-nul of rekenkundige overloopfout nulwaarden veroorzaakt, ontstaat als een INSERT of UPDATE wordt geprobeerd op een karakter, Unicode of binaire kolom waarin de lengte van een nieuwe waarde de maximale grootte van de kolom overschrijdt. Als SETSET ANSI_WARNINGS ON is, wordt de INSERT of UPDATE geannuleerd zoals gespecificeerd door de ISO-standaard. Achterliggende lege plekken worden genegeerd voor tekenkolommen en achterliggende nullen voor binaire kolommen. Wanneer UIT, wordt de data afgekapt tot de grootte van de kolom en slaagt de instructie.

Opmerking

Wanneer er afkap optreedt bij een conversie van binaire of varbinaire gegevens, wordt er geen waarschuwing of fout gegeven, ongeacht de SET opties.

Opmerking

ANSI_WARNINGS wordt niet gerespecteerd bij het doorgeven van parameters in een opgeslagen procedure, door de gebruiker gedefinieerde functie, of bij het declareren en instellen van variabelen in een batch-instructie. Als een variabele bijvoorbeeld is gedefinieerd als teken(3)en vervolgens is ingesteld op een waarde die groter is dan drie tekens, worden de gegevens afgekapt tot de gedefinieerde grootte en slaagt de instructie INSERT of UPDATE.

Je kunt de gebruikersopties sp_configure gebruiken om de standaardinstelling ANSI_WARNINGS voor alle verbindingen met de server in te stellen. Voor meer informatie, zie sp_configure (Transact-SQL).

ANSI_WARNINGS moet AAN staan wanneer je indexen maakt of manipuleert op berekende kolommen of geïndexeerde weergaven. Als SETSET ANSI_WARNINGS OFF is, CREATE, UPDATE, , INSERTen DELETE statements op tabellen met indexen op berekende kolommen of geïndexeerde weergaven zullen falen. Voor meer informatie over de vereiste SET optie-instellingen met geïndexeerde weergaven en indexen op berekende kolommen, zie "Overwegingen bij het gebruik van de SET Statements" in SET Statements (Transact-SQL).

SQL Server bevat de ANSI_WARNINGS database-optie. Dit komt overeen met SET ANSI_WARNINGS. Wanneer SET ANSI_WARNINGS AAN is, worden fouten of waarschuwingen gedeeld door nul, een string die te groot is voor de databasekolom, en andere soortgelijke fouten. Wanneer SET ANSI_WARNINGS UIT is, worden deze fouten en waarschuwingen niet geactiveerd. De standaardwaarde in de model database voor SET ANSI_WARNINGS is UIT. Als niet gespecificeerd, geldt de instelling van ANSI_WARNINGS wel. Als SET ANSI_WARNINGS UIT is, gebruikt SQL Server de waarde van de kolom is_ansi_warnings_on in het sys.databases-catalogusweergave.

Belangrijk

ANSI_WARNINGS moet worden ingesteld op AAN voor het uitvoeren van gedistribueerde query's.

Clients, zoals de SQL Server Native Client ODBC-driver, de SQL Server Native Client OLE DB Provider voor SQL Server, en de Microsoft JDBC-driver voor SQL Server, worden automatisch ingesteld ANSI_WARNINGS op ON met een verbindingsvlag. Dit kan worden geconfigureerd in ODBC-databronnen, in ODBC-verbindingsattributen, ingesteld in de applicatie voordat er verbinding wordt gemaakt. De standaard voor SET ANSI_WARNINGS is UIT voor verbindingen van DB-Library applicaties. Voor meer informatie, zie LOGIN7 in de Tabular Data Stream (TDS) protocolspecificaties.

Wanneer ANSI_DEFAULTS is INGESCHAKELD, ANSI_WARNINGS is ingeschakeld.

De instelling ANSI_WARNINGS wordt gedefinieerd tijdens het uitvoeren of uitvoeren en niet op parseringstijd. Zoals alle SET verklaringen beïnvloedt dit SET ANSI_WARNINGS de huidige sessie.

Als een van beide SETSET ARITHABORTSET ARITHIGNORE UIT is en SETSET ANSI_WARNINGS AAN, geeft SQL Server nog steeds een foutmelding wanneer deel-door-nul of overflow-fouten optreden.

Om de huidige instelling voor deze instelling te bekijken, voert u de volgende query uit.

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

Permissions

Vereist lidmaatschap van de openbare rol.

Voorbeelden

Het volgende voorbeeld toont de drie eerder genoemde situaties, met de SET ANSI_WARNINGS aan en UIT.

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  

Zet ANSI_WARNINGS nu op AAN en 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  

Zet ANSI_WARNINGS nu op UIT en 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;