SET SET ARITHABORT (Transact-SQL)

Platí pro:SQL ServerAzure SQL DatabaseSpravovaná instance Azure SQLAzure Synapse AnalyticsAnalytics Platform System (PDW)Koncový bod analýzy SQL v Microsoft FabricSklad v Microsoft FabricDatabáze SQL v Microsoft Fabric

Toto SET ARITHABORT nastavení určuje, zda dotaz přestane fungovat, když během vykonávání dotazu dojde k chybě přetečení nebo chybě dělení nulou.

  • Když nastavíte SET ARITHABORT ON a SET ANSI_WARNINGS OFF, aritmetické chyby způsobí ukončení dávky. Pokud se chyby vyskytnou v transakci, transakce je vrácena zpět.

  • Pokud dojde k aritmetické chybě a SET ARITHABORT , objeví se varovná zpráva (pokud SET ARITHIGNORE není ) ONa výsledek aritmetické operace je NULL.OFFSET ANSI_WARNINGS

Transact-SQL konvence syntaxe

Syntaxe

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


SET ARITHABORT { ON | OFF }

Syntaxe pro Azure Synapse Analytics a systém analytických platforem (PDW)


SET ARITHABORT ON

Poznámky

Když ANSI_WARNINGS je ( ON výchozí), nastavení nemá ARITHABORT žádný funkční efekt. Aritmetické chyby způsobí ukončení dotazu, ale dávka se nepřeruší (pokud je nastavení XACT_ABORT ).OFF

Výstraha

Výchozí ARITHABORT nastavení pro SQL Server Management Studio (SSMS) je ON, zatímco klientské připojení v aplikaci je výchozí .ARITHABORT OFF I když není žádný funkční rozdíl, dokud ANSI_WARNINGS je , ONARITHABORT nastavení je stále klíč cache. Proto SSMS i aplikace, které používají své výchozí nastavení, mají různé záznamy v cache a mohou mít odlišné plány dotazů, což ztěžuje řešení špatně fungujících dotazů. To znamená, že stejný dotaz může v aplikaci proběhnout pomaleji než v SSMS. Při řešení dotazů ve Management Studiu vždy odpovídej nastavení klienta ARITHABORT .

Pro vyhodnocení výrazu, pokud oba a SET ANSI_WARNINGS jsou SET ARITHABORTOFF a INSERTUPDATE, , nebo příkaz narazí DELETE na aritmetickou, přetečení, dělení nulou nebo chybu domény, dotaz vloží nebo aktualizuje NULL hodnotu. Pokud cílový sloupec není nulovatelný, akce vložení nebo aktualizace selže a uživatel vidí chybu.

Nastavení se odehrává SET ARITHABORT při spuštění nebo běhu a ne při parse.

SET ARITHABORT OFFnení podporován v dedikovaných SQL poolech Azure Synapse Analytics.

Povolení

Vyžaduje členství ve veřejné roli .

Zobrazit aktuální nastavení ARITHABORT

Pro zobrazení aktuálního nastavení pro SET ARITHABORT, spusť následující dotaz T-SQL:

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

Examples

Následující příklad ukazuje chyby dělení nulou a přetečení s různými SET ARITHABORT nastaveními.

  1. Skript vytváří ukázkové tabulky t1 a t2 vkládá vzorkové datové hodnoty.
  2. Nastavte ANSI_WARNINGS ON a spusťte testy, abyste zjistili výchozí chování chyby dělení nulou a přetečení aritmetiky.
  3. Nastavte tak, že má ARITHABORT účinek, a nastavit ANSI_WARNINGS OFF .ARITHABORT ON Proveďte testy, abyste zjistili chování s chybou dělení nulou a přetečením aritmetiky.
  4. Nastavte oba a ANSI_WARNINGS OFFARITHABORT OFF. Proveďte testy, abyste zjistili chování s chybou dělení nulou a přetečením aritmetiky.
  5. Uklidit ukázkové tabulky.
-- 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