SET ARITHABORT (Transact-SQL)

Aktualisiert: 14. April 2006

Beendet eine Abfrage, wenn während der Abfrage ein Überlauffehler oder ein Fehler aufgrund einer Division durch Null auftritt.

Themenlink (Symbol)Transact-SQL-Syntaxkonventionen

Syntax

SET ARITHABORT { ON | OFF }
[ ; ]

Hinweise

Wenn SET ARITHABORT auf ON und SET ANSI WARNINGS auf ON festgelegt ist, bewirken diese Fehlerbedingungen, dass die Abfrage beendet wird. Wenn SET ARITHABORT auf ON und SET ANSI WARNINGS auf OFF festgelegt ist, bewirken diese Fehlerbedingungen, dass der Batch beendet wird. Treten die Fehler in einer Transaktion auf, so wird für die Transaktion ein Rollback durchgeführt. Wenn SET ARITHABORT auf OFF festgelegt ist und einer dieser Fehler auftritt, wird eine Warnmeldung angezeigt und dem Ergebnis der arithmetischen Operation NULL zugewiesen.

ms190306.note(de-de,SQL.90).gifHinweis:
Wenn weder SET ARITHABORT noch SET ARITHIGNORE festgelegt sind, gibt SQL Server 2005 NULL zurück und gibt nach dem Ausführen der Abfrage eine Warnmeldung zurück.

In SQL Server 2005 wird durch Festlegen von ANSI_WARNINGS auf ON implizit ARITHABORT auf ON festgelegt, wenn der Datenbank-Kompatibilitätsgrad 90 beträgt. Wenn der Datenbank-Kompatibilitätsgrad kleiner oder gleich 80 ist, muss die Option ARITHABORT explizit auf ON festgelegt werden.

Wenn in einer INSERT-, DELETE- oder UPDATE-Anweisung ein arithmetischer Fehler (Überlauf, Division durch Null oder Bereichsfehler) bei der Auswertung eines Ausdrucks auftritt und SET ARITHABORT auf OFF festgelegt ist, fügt SQL Server einen NULL-Wert ein oder aktualisiert ihn. Wenn die Zielspalte keine NULL-Werte zulässt, schlägt das Einfügen oder Aktualisieren fehl, und dem Benutzer wird ein Fehler angezeigt.

Auch wenn SET ARITHABORT oder SET ARITHIGNORE auf OFF und SET ANSI_WARNINGS auf ON festgelegt sind, gibt SQL Server eine Fehlermeldung zurück, wenn ein Fehler aufgrund einer Division durch Null oder ein Überlauffehler auftritt.

Wenn SET ARITHABORT auf OFF festgelegt ist und bei der Auswertung der booleschen Bedingung einer IF-Anweisung ein Abbruchfehler auftritt, wird der FALSE-Zweig ausgeführt.

SET ARITHABORT muss beim Erstellen oder Ändern von Indizes für berechnete Spalten oder indizierte Sichten auf ON festgelegt sein. Wenn SET ARITHABORT auf OFF festgelegt ist, schlagen die CREATE-, UPDATE-, INSERT- und DELETE-Anweisungen in Tabellen mit Indizes auf berechneten Spalten oder indizierten Sichten fehl. Weitere Informationen zu erforderlichen SET-Optionseinstellungen bei indizierten Sichten und Indizes für berechnete Spalten finden Sie unter SET-Optionen mit Auswirkungen auf Ergebnisse.

Die Einstellung von SET ARITHABORT wird zur Ausführungszeit und nicht zur Analysezeit festgelegt.

Berechtigungen

Erfordert die Mitgliedschaft in der public-Rolle.

Beispiele

Im folgenden Beispiel werden die Fehler aufgrund einer Division durch Null und Überlauffehler mit beiden SET ARITHABORT-Einstellungen veranschaulicht.

-- SET ARITHABORT
-------------------------------------------------------------------------------
-- Create tables t1 and t2 and insert data values.
CREATE TABLE t1 (
   a TINYINT, 
   b TINYINT
);
CREATE TABLE t2 (
   a TINYINT
);
GO
INSERT INTO t1 
VALUES (1, 0);
INSERT INTO t1 
VALUES (255, 1);
GO

PRINT '*** SET ARITHABORT ON';
GO
-- SET ARITHABORT ON and testing.
SET ARITHABORT ON;
GO

PRINT '*** Testing divide by zero during SELECT';
GO
SELECT a / b AS ab 
FROM t1;
GO

PRINT '*** Testing divide by zero during INSERT';
GO
INSERT INTO t2
SELECT a / b AS ab  
FROM t1;
GO

PRINT '*** Testing tinyint overflow';
GO
INSERT INTO t2
SELECT a + b AS ab 
FROM t1;
GO

PRINT '*** Resulting data - should be no data';
GO
SELECT * 
FROM t2;
GO

-- Truncate table t2.
TRUNCATE TABLE t2;
GO

-- SET ARITHABORT OFF and testing.
PRINT '*** SET ARITHABORT OFF';
GO
SET ARITHABORT OFF;
GO

-- This works properly.
PRINT '*** Testing divide by zero during SELECT';
GO
SELECT a / b AS ab  
FROM t1;
GO

-- This works as if SET ARITHABORT was ON.
PRINT '*** Testing divide by zero during INSERT';
GO
INSERT INTO t2
SELECT a / b AS ab  
FROM t1;
GO
PRINT '*** Testing tinyint overflow';
GO
INSERT INTO t2;
SELECT a + b AS ab 
FROM t1;
GO

PRINT '*** Resulting data - should be 0 rows';
GO
SELECT * 
FROM t2;
GO

-- Drop tables t1 and t2.
DROP TABLE t1;
DROP TABLE t2;
GO

Siehe auch

Verweis

SET (Transact-SQL)
SET ARITHIGNORE (Transact-SQL)
SESSIONPROPERTY (Transact-SQL)

Hilfe und Informationen

Informationsquellen für SQL Server 2005

Änderungsverlauf

Version Verlauf

14. April 2006

Aktualisierter Inhalt:
  • Es wurde eine Anmerkung hinzugefügt, wie sich das Festlegen von ANSI_WARNINGS auf ON auf die Einstellung ARITHABORT auswirkt.