SET SET ARITHABORT (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

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

Transact-SQL-Syntaxkonventionen

Syntax

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

SET ARITHABORT { ON | OFF }

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

SET ARITHABORT ON

Hinweise

Stelle in deinen Anmeldesitzungen immer auf AN ein ARITHABORT . Das Ausschalten ARITHABORT kann die Abfrageoptimierung negativ beeinflussen und zu Performance-Problemen führen.

Warnung

Die Standardeinstellung ARITHABORT für SQL Server Management Studio ist EIN. Client-Anwendungen, die auf AUS eingestellt ARITHABORT sind, können unterschiedliche Abfragepläne erhalten, was es erschwert, schlecht ausgeführte Abfragen zu beheben. Das heißt, dieselbe Abfrage könnte in Management Studio schnell, in der Anwendung jedoch langsam ausgeführt werden. Wenn Sie mit Management Studio Abfragen beheben, passen Sie immer die Client-Einstellung ARITHABORT an.

Wenn SET ARITHABORT und SET ANSI-WARNUNGEN AKTIVIERT sind, führen diese Fehlerbedingungen dazu, dass die Abfrage endet.

Wenn SET ARITHABORT AN ist und SET ANSI WARNINGS AUS, führen diese Fehlerzustände dazu, dass der Batch endet. Treten die Fehler in einer Transaktion auf, so wird für die Transaktion ein Rollback durchgeführt. Wenn SETSET ARITHABORT AUS ist und einer dieser Fehler auftritt, erscheint eine Warnmeldung und das Ergebnis der arithmetischen Operation ist NULL.

Wenn SET ARITHABORT und SET ANSI-WARNUNGEN AUS sind und einer dieser Fehler auftritt, erscheint eine Warnmeldung, und das Ergebnis der arithmetischen Operation ist NULL.

Hinweis

Wenn weder noch SET ARITHABORTSETSET ARITHIGNORE ON ist, kehrt der SQL Server zurück NULL und nach der Abfrage erscheint eine Warnmeldung.

Wenn ANSI_WARNINGS der Wert ON ist und das Datenbankkompatibilitätsniveau auf 90 oder höher gesetzt ist, dann ARITHABORT ist implizit ON, unabhängig von der Werteinstellung. Wenn die Datenbankkompatibilitätsstufe auf 80 oder früher gesetzt ist, muss die ARITHABORT Option explizit auf ON gesetzt werden.

Für die Ausdrucksauswertung gilt: Wenn SET ARITHABORT OFF ist und eine INSERT, UPDATE, oder DELETE Anweisung auf einen arithmetischen Überlauf-, Teile-zu-Null- oder Domänenfehler stößt, fügt der SQL Server einen NULL Wert ein oder aktualisiert ihn auf. Wenn die Zielspalte keine NULL-Werte zulässt, schlägt das Einfügen oder Aktualisieren fehl, und dem Benutzer wird ein Fehler angezeigt.

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

Wenn SETSET ARITHABORT AUS ist und während der Auswertung der Booleschen Bedingung einer IF-Anweisung ein Abbruchfehler auftritt, wird der FALSE-Sprung ausgeführt.

SET SET ARITHABORT muss AN sein, wenn du Indizes auf berechneten Spalten oder indexierten Ansichten erstellst oder änderst. Wenn SET ARITHABORT OFF ist, versagen CREATE, UPDATE, INSERT, und DELETE Anweisungen auf Tabellen mit Indizes auf berechneten Spalten oder indexierten Ansichten.

Die Einstellung von SETSET ARITHABORT erfolgt zur Ausführungs- oder Laufzeit und nicht zur Parsezeit.

SET SET ARITHABORTOFF wird in dedizierten SQL-Pools von Azure Synapse Analytics nicht unterstützt.

Um die aktuelle Einstellung für SETSET ARITHABORTanzuzeigen, führen Sie folgende Abfrage aus:

DECLARE @ARITHABORT VARCHAR(3) = 'OFF';  
IF ( (64 & @@OPTIONS) = 64 ) SET @ARITHABORT = 'ON';  
SELECT @ARITHABORT AS ARITHABORT;  

Berechtigungen

Erfordert die Mitgliedschaft in der public -Rolle.

Beispiele

Im folgenden Beispiel werden die Fehler aufgrund einer Division durch Null und Überlauffehler mit 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