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

De SET ARITHABORT instelling bepaalt of een query stopt wanneer er een overflow- of deel-door-nul-fout optreedt tijdens de uitvoering van een query.

  • Wanneer je en SET ANSI_WARNINGS OFFzetSET ARITHABORT ON, zorgen rekenkundige fouten ervoor dat de batch eindigt. Als de fouten optreden in een transactie, wordt de transactie teruggedraaid.

  • Als zowel SET ARITHABORT als SET ANSI_WARNINGS zijn OFF en een rekenfout optreedt, verschijnt er een waarschuwingsbericht (tenzij SET ARITHIGNORE is ON) en is het resultaat van de rekenkundige bewerking .NULL

Transact-SQL syntaxis-conventies

Syntaxis

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


SET ARITHABORT { ON | OFF }

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


SET ARITHABORT ON

Opmerkingen

Wanneer ANSI_WARNINGS is ON (de standaard), heeft de instelling van ARITHABORT geen functioneel effect. Rekenfouten zorgen ervoor dat de query eindigt, maar de batch stopt niet (zolang de instelling XACT_ABORT op OFFis ).

Waarschuwing

De standaardinstelling ARITHABORT voor SQL Server Management Studio (SSMS) is ON, terwijl een clientverbinding in een applicatie standaard op ARITHABORT OFF. Zelfs als er geen functioneel verschil is, zolang ANSI_WARNINGS dat is ON, blijft de ARITHABORT instelling een cache-sleutel. Daarom hebben SSMS en een applicatie die hun respectievelijke standaardinstellingen gebruiken, verschillende cache-entries en kunnen ze verschillende queryplannen krijgen, waardoor het moeilijk is om slecht presterende queries op te lossen. Dat wil zeggen, dezelfde query kan langzamer in de applicatie worden uitgevoerd dan in SSMS. Bij het oplossen van problemen met Management Studio, kies altijd de clientinstelling ARITHABORT .

Voor expressie-evaluatie, als zowel SET ANSI_WARNINGS en OFFSET ARITHABORT zijn als een INSERT, UPDATE, of DELETE statement een rekenkundige, overflow-, deel-door-nul- of domeinfout, voegt de query een waarde in of werkt deze bijNULL. Als de doelkolom niet nul is, mislukt de invoeg- of updateactie en ziet de gebruiker een foutmelding.

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

SET ARITHABORT OFFwordt niet ondersteund in Azure Synapse Analytics dedicated SQL pools.

Permissions

Vereist lidmaatschap van de openbare rol.

Bekijk de huidige instelling van ARITHABORT

Om de huidige instelling voor SET ARITHABORTte bekijken, voer je de volgende T-SQL-query uit:

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

Voorbeelden

Het volgende voorbeeld toont de deel-door-nul en overloopfouten met verschillende SET ARITHABORT instellingen.

  1. Het script maakt voorbeeldtabellen t1 en t2 voegt voorbeeldgegevenswaarden in.
  2. Stel tests in ANSI_WARNINGS ON en voer uit om het standaardgedrag van een deel-door-nul fout en rekenkundige overloop te zien.
  3. Stel ANSI_WARNINGS OFF zo in dat effect ARITHABORT heeft, en stel ARITHABORT ON. Voer tests uit om het gedrag te zien met een deel-door-nul fout en een rekenkundige overloop.
  4. Stel zowel ANSI_WARNINGS OFF als ARITHABORT OFF. Voer tests uit om het gedrag te zien met een deel-door-nul fout en een rekenkundige overloop.
  5. Maak de voorbeeldtabellen schoon.
-- SET ARITHABORT  
-------------------------------------------------------------------------------  
-- Create tables t1 and t2 and insert data values.  
CREATE TABLE t1 (  
   a TINYINT,   
   b TINYINT  
);  
CREATE TABLE t2 (  
   a TINYINT NOT NULL  
);  
GO  
INSERT INTO t1   
VALUES (1, 0);  
INSERT INTO t1   
VALUES (255, 1);  
GO  

-- First run with ANSI_WARNINGS ON to see the default behavior.
PRINT '*** SET ANSI_WARNINGS ON';  
SET ANSI_WARNINGS ON;
SET XACT_ABORT OFF;    -- To make sure that we have the default setting for this option.  
GO
PRINT '*** Testing divide-by-zero during SELECT';  
GO  
SELECT a / b AS ab   
FROM t1;  
PRINT 'This prints, despite the error message.';
GO  

PRINT '*** Testing divide-by-zero during INSERT';  
GO  
INSERT INTO t2  
SELECT a / b AS ab    
FROM t1;  
PRINT 'This prints, despite the error message.';
GO  

PRINT '*** Testing tinyint overflow';  
GO  
INSERT INTO t2  
SELECT a + b AS ab   
FROM t1;  
PRINT 'This prints, despite the error message.';
GO  

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

-- Truncate table t2.  
TRUNCATE TABLE t2;  
GO  

-- Set ANSI_WARNINGS OFF so that ARITHABORT has effect, and set ARITHABORT ON.
PRINT '*** SET ANSI_WARNINGS OFF; SET ARITHABORT ON';  
GO  
SET ANSI_WARNINGS OFF; 
SET ARITHABORT ON;  
GO  

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

PRINT '*** Testing divide-by-zero during INSERT';  
GO  
INSERT INTO t2  
SELECT a / b AS ab    
FROM t1;  
PRINT 'This does not print.';
GO  
PRINT '*** Testing tinyint overflow';  
GO  
INSERT INTO t2  
SELECT a + b AS ab   
FROM t1;  
PRINT 'This does not print.';
GO  

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

-- Truncate table t2.  
TRUNCATE TABLE t2;  
GO  

-- Set both ANSI_WARNINGS OFF and ARITHABORT OFF.
PRINT '*** SET ARITHABORT OFF';  
GO  
SET ARITHABORT OFF;  
GO  

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

PRINT '*** Testing divide-by-zero during INSERT';  
GO  
-- Fails with NOT NULL violation.
INSERT INTO t2  
SELECT a / b AS ab    
FROM t1;  
GO  
PRINT '*** Testing tinyint overflow';  
GO  
-- Fails with NOT NULL violation
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 and restore ANSI_WARNINGS
DROP TABLE t1;  
DROP TABLE t2;  
SET ANSI_WARNINGS ON
GO