SET ANSI_WARNINGS (Transact-SQL)

Gilt für:SQL ServerAzure SQL-DatenbankVerwaltete Azure SQL-InstanzAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL-Analyseendpunkt in Microsoft FabricLagerhaus in Microsoft FabricSQL-Datenbank in Microsoft Fabric

Gibt das ISO-Standardverhalten für verschiedene Fehlerbedingungen an.

Transact-SQL-Syntaxkonventionen

Syntax

Syntax für SQL Server und serverlose SQL-Pools in Azure Synapse Analytics, Microsoft Fabric

SET ANSI_WARNINGS { ON | OFF }

Syntax für Azure Synapse Analytics und Analytics-Plattformsystem (PDW)

SET ANSI_WARNINGS ON

Hinweise

SET ANSI_WARNINGS beeinflusst folgende Zustände:

  • Bei ON wird eine Warnmeldung generiert, wenn NULL-Werte in Aggregatfunktionen, wie z. B. SUM, AVG, MAX, MIN, STDEV, STDEVP, VAR, VARP oder COUNT, auftreten. Bei OFF wird keine Warnung ausgegeben.

  • Bei ON bewirken Fehler aufgrund einer Division durch Null und arithmetische Überlauffehler, dass für die Anweisung ein Rollback ausgeführt und eine Fehlermeldung generiert wird. Bei OFF bewirken Fehler aufgrund einer Division durch Null und arithmetische Überlauffehler, dass NULL-Werte zurückgegeben werden. Das Verhalten, bei dem ein Teile-durch-Null- oder arithmetischer Überlauffehler dazu führt, dass Nullwerte zurückgegeben werden, tritt auf, wenn ein INSERT oder UPDATE auf einem Zeichen, Unicode oder einer Binärspalte ausprobiert wird, in der die Länge eines neuen Wertes die maximale Größe der Spalte übersteigt. Wenn SETSET ANSI_WARNINGS ON ist, wird das INSERT oder UPDATE gemäß der ISO-Norm aufgehoben. Nachfolgende Leerzeichen werden in Zeichenspalten ignoriert, und nachfolgende Nullen werden in Binärspalten ignoriert. Bei OFF werden Daten auf die Spaltengröße abgeschnitten, und die Anweisung wird erfolgreich ausgeführt.

Hinweis

Wenn eine Trunkierung bei einer Konvertierung zu oder von binären oder varbinären Daten auftritt, wird keine Warnung oder Fehler ausgegeben, unabhängig von den Optionen SET .

Hinweis

ANSI_WARNINGS wird nicht berücksichtigt, wenn Parameter in einer gespeicherten Prozedur, einer benutzerdefinierten Funktion oder beim Deklarieren und Setzen von Variablen in einer Batch-Anweisung übermittelt werden. Wird beispielsweise eine Variable als char(3) definiert und dann auf einen Wert festgelegt, der länger als drei Zeichen ist, werden die Daten auf die definierte Größe abgeschnitten, und die Anweisung INSERT oder UPDATE wird erfolgreich ausgeführt.

Du kannst die Benutzeroptionen sp_configure nutzen, um die Standardeinstellung ANSI_WARNINGS für alle Verbindungen zum Server festzulegen. Weitere Informationen finden Sie unter sp_configure (Transact-SQL).

ANSI_WARNINGS muss AN sein, wenn Sie Indizes auf berechneten Spalten oder indexierten Ansichten erstellen oder bearbeiten. Wenn SETSET ANSI_WARNINGS OFF ist, schlagen CREATE, UPDATE, INSERT, und DELETE Anweisungen in Tabellen mit Indizes auf berechneten Spalten oder indexierten Ansichten fehl. Weitere Informationen zu den erforderlichen SET Optionseinstellungen mit indexierten Ansichten und Indizes auf berechneten Spalten finden Sie unter "Überlegungen bei der Nutzung der SET Aussagen" unter SET Aussagen (Transact-SQL).

SQL Server beinhaltet die ANSI_WARNINGS Datenbank-Option. Dies entspricht SET ANSI_WARNINGS. Wenn SET ANSI_WARNINGS ON ist, werden Fehler oder Warnungen geteilt durch Null ausgelöst, eine Zeichenkette ist für die Datenbankspalte zu groß und andere ähnliche Fehler. Wenn SET ANSI_WARNINGS AUS ist, werden diese Fehler und Warnungen nicht angezeigt. Der Standardwert in der model Datenbank für SET ANSI_WARNINGS ist AUS. Falls nicht angegeben, gilt die Einstellung von ANSI_WARNINGS . Wenn OFF SET ANSI_WARNINGS ist, verwendet SQL Server den Wert der Spalte is_ansi_warnings_on in der sys.databases-Katalogansicht.

Wichtig

ANSI_WARNINGS sollte für die Ausführung verteilter Abfragen auf "EIN" festgelegt werden.

Clients wie der SQL Server Native Client ODBC-Treiber, der SQL Server Native Client OLE DB Provider für SQL Server und der Microsoft JDBC-Treiber für SQL Server werden automatisch auf ON mit einer Verbindungsflagge gesetztANSI_WARNINGS. Diese Einstellung kann in ODBC-Datenquellen und ODBC-Verbindungsattributen konfiguriert werden, die in der Anwendung festgelegt werden, bevor die Verbindung hergestellt wird. Die Standardeinstellung für SET ANSI_WARNINGS ist AUS für Verbindungen von DB-Library Anwendungen. Weitere Informationen finden Sie unter LOGIN7 in den TDS-Protokollspezifikationen (Tabular Data Stream).

Wenn ANSI_DEFAULTS aktiviert ist, ANSI_WARNINGS ist diese Option aktiviert.

Die Einstellung wird ANSI_WARNINGS zur Ausführung oder Laufzeit definiert und nicht zur Analysezeit. Wie alle SET Statements wirkt sich SET ANSI_WARNINGS auf die aktuelle Sitzung aus.

Wenn entweder oder SET ARITHABORTSETSET ARITHIGNORE AUS und SETSET ANSI_WARNINGS AN ist, liefert SQL Server weiterhin eine Fehlermeldung, wenn Divivide-by-Zero- oder Überlauffehler auftreten.

Um die aktuelle Einstellung anzuzeigen, führen Sie die folgende Abfrage aus.

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

Berechtigungen

Erfordert die Mitgliedschaft in der public -Rolle.

Beispiele

Das folgende Beispiel zeigt die drei bereits erwähnten Situationen, mit AN SET ANSI_WARNINGS und AUS.

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  

Jetzt auf AN stellen ANSI_WARNINGS und testen.

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  

Jetzt auf AUS stellen ANSI_WARNINGS und testen.

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;