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

Beëindigt een query wanneer er een overflow- of deel-door-nul-fout optreedt tijdens de uitvoering van een query.

Transact-SQL syntaxis-conventies

Syntaxis

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

SET ARITHABORT { ON | OFF }

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

SET ARITHABORT ON

Opmerkingen

Zet ARITHABORT altijd op AAN tijdens je inlogsessies. Op UIT zetten ARITHABORT kan queryoptimalisatie negatief beïnvloeden, wat leidt tot prestatieproblemen.

Waarschuwing

De standaardinstelling ARITHABORT voor SQL Server Management Studio is AAN. Clientapplicaties die op UIT zetten ARITHABORT kunnen verschillende queryplannen ontvangen, waardoor het moeilijk wordt om slecht presterende queries te troubleshooten. Dat wil zeggen, dezelfde query kan snel uitvoeren in Management Studio, maar traag in de applicatie. Bij het oplossen van problemen met Management Studio, kies altijd de clientinstelling ARITHABORT .

Wanneer SET ARITHABORT en SET ANSI-WAARSCHUWINGEN AAN staan, zorgen deze foutcondities ervoor dat de query eindigt.

Wanneer SET ARITHABORT AAN is en SET ANSI WARNINGS UIT, zorgen deze foutcondities ervoor dat de batch eindigt. Als de fouten optreden in een transactie, wordt de transactie teruggedraaid. Wanneer SETSET ARITHABORT UIT is en een van deze fouten optreedt, verschijnt er een waarschuwingsbericht en is het resultaat van de rekenkundige bewerking NULL.

Als SET ARITHABORT en SET ANSI-WAARSCHUWINGEN UIT zijn en een van deze fouten optreedt, verschijnt er een waarschuwingsmelding en is NULLhet resultaat van de rekenkundige bewerking .

Opmerking

Als geen van beide SET ARITHABORT ON SETSET ARITHIGNORE is, keert SQL Server terug NULL en verschijnt er een waarschuwingsbericht nadat de query is uitgevoerd.

Wanneer ANSI_WARNINGS een waarde van ON heeft en het databasecompatibiliteitsniveau is ingesteld op 90 of hoger, dan ARITHABORT is impliciet ON ongeacht de waarde-instelling. Als het databasecompatibiliteitsniveau op 80 of eerder is gezet, moet de ARITHABORT optie expliciet op AAN worden gezet.

Voor expressie-evaluatie, als SET ARITHABORT OFF is en een INSERT, , of-instructie UPDATEDELETE een rekenkundige, overflow-, deel-door-nul- of domeinfout tegenkomt, voegt SQL Server een NULL waarde in of werkt deze bij. Als de doelkolom niet nul is, mislukt de invoeg- of updateactie en ziet de gebruiker een foutmelding.

Wanneer een of SET ARITHABORTSETSET ARITHIGNORE UIT is en SETSET ANSI_WARNINGS AAN, geeft SQL Server nog steeds een foutmelding wanneer deel-door-nul of overflowfouten worden tegengekomen.

Wanneer SETSET ARITHABORT UIT is en er een abortfout optreedt tijdens de evaluatie van de Booleaanse voorwaarde van een IF-instructie, voert de FALSE-tak uit.

SET SET ARITHABORT Moet AAN staan wanneer je indexen maakt of verandert op berekende kolommen of geïndexeerde views. Als SET ARITHABORT OFF is, falen CREATE, UPDATE, INSERT, en DELETE statements op tabellen met indexen op berekende kolommen of geïndexeerde weergaven.

De instelling van SETSET ARITHABORT gebeurt tijdens execute- of run-tijd en niet tijdens parse.

SET SET ARITHABORTOFF wordt niet ondersteund in Azure Synapse Analytics dedicated SQL pools.

Om de huidige instelling voor SETSET ARITHABORTte bekijken, voer je de volgende zoekopdracht uit:

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

Permissions

Vereist lidmaatschap van de openbare rol.

Voorbeelden

Het volgende voorbeeld toont de deel-door-nul en overloopfouten die instellingen hebben SET ARITHABORT .

-- 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