Delen via


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 }

Syntax for Azure Synapse Analytics and Analytics Platform System (PDW)

SET ARITHABORT ON

Opmerkingen

Zet ARITHABORT altijd op AAN tijdens je logonsessies. Het instellen van ARITHABORT op UIT kan de queryoptimalisatie negatief beïnvloeden, wat tot prestatieproblemen kan leiden.

Waarschuwing

De standaard ARITHABORT-instelling voor SQL Server Management Studio is AAN. Clientapplicaties die ARITHABORT op UIT zetten, 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 moet je altijd de client ARITHABORT-instelling kiezen.

Wanneer SET ARITHABORT en SET ANSI WARNINGS 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 SET ARITHABORT UIT is en een van deze fouten optreedt, verschijnt er een waarschuwingsbericht en is NULLhet resultaat van de rekenkundige bewerking .

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

Opmerking

Als noch SET ARITHABORT noch SET ARITHIGNORE AAN 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 is ARITHABORT impliciet AAN, ongeacht de waarde-instelling. Als het databasecompatibiliteitsniveau op 80 of hoger is gezet, moet de ARITHABORT-optie expliciet op AAN worden gezet.

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

Wanneer ofwel SET ARITHABORT of SET ARITHIGNORE UIT is en SET ANSI_WARNINGS AAN is, geeft SQL Server nog steeds een foutmelding terug bij deling-door-nul of overflow-fouten.

Wanneer SET ARITHABORT UIT is en er een afbreekfout optreedt tijdens de evaluatie van de Booleaanse voorwaarde van een IF-instructie, wordt de FALSE-tak uitgevoerd.

SET ARITHABORT moet AAN staan wanneer je indexen aanmaakt of verandert op berekende kolommen of geïndexeerde weergaven. Als SET ARITHABORT uit is, falen de CREATE, Update, Insert- en DELETE-instructies op tabellen met indexen op berekende kolommen of geïndexeerde weergaven.

De instelling van SET ARITHABORT gebeurt tijdens execute- of runtime, en niet tijdens parsetijd.

SET ARITHABORT OFF wordt niet ondersteund in Azure Synapse Analytics speciale SQL-pools.

Om de huidige instelling voor SET ARITHABORT te bekijken, voer de volgende query 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