SET SET ARITHABORT (Transact-SQL)

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példányAzure Synapse AnalyticsElemzési platformrendszer (PDW)SQL Analytics-végpont a Microsoft FabricbenRaktár a Microsoft FabricbenSQL-adatbázis a Microsoft Fabricben

Ez a SET ARITHABORT beállítás határozza meg, hogy a lekérdezés megáll-e, ha túlcsordulás vagy nullával oszt hiba történik a lekérdezés végrehajtása során.

  • Ha beállítod SET ARITHABORT ON és SET ANSI_WARNINGS OFF, az aritmetikai hibák miatt a batch véget ér. Ha a hibák egy tranzakcióban előfordulnak, a tranzakciót visszafordítják.

  • Ha mind SET ARITHABORT az aritmetikai SET ANSI_WARNINGSOFF hiba előfordul, figyelmeztető üzenet jelenik meg (kivéve, SET ARITHIGNORE ha az ), ONés az aritmetikai művelet eredménye NULL.

Transact-SQL szintaxis konvenciók

Szemantika

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


SET ARITHABORT { ON | OFF }

Az Azure Synapse Analytics and Analytics Platform System (PDW) szintaxisa


SET ARITHABORT ON

Megjegyzések

Amikor ANSI_WARNINGS is ON (az alapértelmezett állapot), a beállításnak ARITHABORT nincs funkcionális hatása. Számtozási hibák miatt a lekérdezés véget ér, de a kötet nem szűnik meg (amíg a beállítás XACT_ABORT ).OFF Az aritmetikai hibák közé tartoznak a túlcsordulás, nullával osztó vagy tartományhibák.

Figyelmeztetés

Az SQL Server Management Studio (SSMS) alapértelmezett ARITHABORT beállítása ON, míg egy alkalmazás kliens kapcsolata alapértelmezettként ARITHABORT OFF. Még ha nincs is funkcionális különbség ANSI_WARNINGS , amíg van ON, a ARITHABORT beállítás továbbra is gyorsítótár kulcs. Ezért az SSMS és egy alkalmazás is eltérő gyorsítótárbejegyzéseket kap, és eltérő lekérdezési tervet kaphatnak, ami megnehezíti a rosszul teljesítő lekérdezések hibakeresését. Vagyis ugyanaz a lekérdezés lassabban futhat az alkalmazásban, mint az SSMS-ben. A Management Studio-val történő lekérdezések hibakeresésekor mindig egyeztess a kliens ARITHABORT beállításokkal.

Az expresszív értékeléséhez, ha mind SET ANSI_WARNINGS a és SET ARITHABORT mind OFF egy INSERT, UPDATE, vagy DELETE állítás aritmetikai hibába ütközik, a lekérdezés hozzáad vagy frissít egy NULL értéket. Ha a céloszlop nem nullable, a beadás vagy frissítés művelet sikertelen, és a felhasználó hibát lát.

A beállítás SET ARITHABORT végrehajtáskor vagy futásidőben történik, nem parse időben.

SET ARITHABORT OFFnem támogatott az Azure Synapse Analytics dedikált SQL poolokban.

Permissions

A nyilvános szerepkör tagságát igényli.

Nézze meg a jelenlegi beállítást ARITHABORT

A jelenlegi beállítás megtekintéséhez SET ARITHABORTfutassák a következő T-SQL lekérdezést:

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

Példák

A következő példa a nullával osztó és túlfolyó hibákat mutatja különböző SET ARITHABORT beállításokkal.

  1. A szkript mintatáblákat t1 hoz létre, és t2 mintaadat-értékeket is beilleszt.
  2. Állítsd ANSI_WARNINGS ON be és futtasd be a teszteket, hogy megnézd a nullával osztó hiba és az aritmetikai túlömlés alapértelmezett viselkedését.
  3. Állítsuk ANSI_WARNINGS OFF be úgy, hogy ez ARITHABORT hatással van, és állítsuk ARITHABORT ONbe . Futtatj teszteket, hogy lássuk a viselkedést nullával osztó hibával és aritmetikai túlterheléssel.
  4. Állítsd be mindkettőt ANSI_WARNINGS OFF és ARITHABORT OFF. Futtatj teszteket, hogy lássuk a viselkedést nullával osztó hibával és aritmetikai túlterheléssel.
  5. Takarítsd ki a mintatáblákat.
-- 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