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

Ukončí dotaz, když během provádění dotazu dojde k přetečení nebo chybě dělení nulou.

Transact-SQL konvence syntaxe

Syntaxe

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

SET ARITHABORT { ON | OFF }

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

SET ARITHABORT ON

Poznámky

Vždy nastavte ARITHABORT ZAPNUTO při přihlašovacích sezeních. Nastavení ARITHABORT na VYPNUTO může negativně ovlivnit optimalizaci dotazů a vést k problémům s výkonem.

Výstraha

Výchozí ARITHABORT nastavení SQL Server Management Studio je ZAPNUTO. Klientské aplikace nastavené ARITHABORT na VYPNUTO mohou dostávat různé plány dotazů, což ztěžuje řešení špatně fungujících dotazů. To znamená, že stejný dotaz může být v Management Studiu rychlý, ale v aplikaci pomalý. Při řešení dotazů ve Management Studiu vždy odpovídej nastavení klienta ARITHABORT .

Když SET ARITHABORT jsou A ANSI VAROVÁNÍ ZAPNUTÁ SET , tyto chybové podmínky způsobí ukončení dotazu.

Když SET ARITHABORT je ZAPNUTO a SET ANSI WARNINGS je VYPNUTO, tyto chybové podmínky způsobí ukončení dávkování. Pokud se chyby vyskytnou v transakci, transakce je vrácena zpět. Když SETSET ARITHABORT je VYPNUTO a jedna z těchto chyb nastane, objeví se varovná zpráva a výsledek aritmetické operace je NULL.

Pokud SET ARITHABORT a SET ANSI VAROVÁNÍ jsou VYPNUTA a jedna z těchto chyb nastane, objeví se varovná zpráva a výsledek aritmetické operace je NULL.

Poznámka:

Pokud ani ani SET ARITHABORT není SETSET ARITHIGNORE zapnuto, SQL Server vrátí a NULL po spuštění dotazu se objeví varovná zpráva.

Když ANSI_WARNINGS má hodnotu ON a úroveň kompatibility databáze je nastavena na 90 nebo více, pak ARITHABORT je implicitně ON bez ohledu na nastavení hodnoty. Pokud je úroveň kompatibility databáze nastavena na 80 nebo dříve, musí být volba ARITHABORT explicitně nastavena na ON.

Pro vyhodnocení výrazu, pokud SET ARITHABORT je VYPNUTO a INSERT, UPDATE, nebo DELETE příkaz narazí na aritmetickou, přetečení, dělení nulou nebo chybu domény, SQL Server vloží nebo aktualizuje hodnotuNULL. Pokud cílový sloupec není nulovatelný, akce vložení nebo aktualizace selže a uživatel vidí chybu.

Když je nebo SET ARITHABORTSETSET ARITHIGNORE VYPNUTO a SETSET ANSI_WARNINGS je ZAPNUTO, SQL Server stále vrací chybovou zprávu při chybách dělení nulou nebo přetečení.

Když SETSET ARITHABORT je OFF a během vyhodnocování Booleovské podmínky IF příkazu dojde k chybě přerušení, vykoná se větev FALSCHE.

SET SET ARITHABORT musí být zapnutý, když vytváříte nebo měníte indexy na vypočítaných sloupcích nebo indexovaných pohledech. Pokud SET ARITHABORT je VYPNUTO, CREATE, UPDATE, INSERT, a příkazy DELETE na tabulkách s indexy na vypočítaných sloupcích nebo indexovaných pohledech selžou.

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

SET SET ARITHABORTOFF není podporován v dedikovaných SQL poolech Azure Synapse Analytics.

Pro zobrazení aktuálního nastavení pro SETSET ARITHABORT, spusťte následující dotaz:

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

Povolení

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

Examples

Následující příklad ukazuje chyby dělení nulou a přetečení, které mají SET ARITHABORT nastavení.

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