Sdílet prostřednictvím


PŘIPRAVTE 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 }

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

SET ARITHABORT ON

Poznámky

Vždy nastavte ARITHABORT na ZAPNUTÉ při přihlašovacích relací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í nastavení ARITHABORT pro SQL Server Management Studio je ZAPNUTO. Klientské aplikace s nastavením 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í problémů s dotazy ve Management Studiu vždy nastavte klientský ARITHABORT.

Když jsou NASTAVENY ARITHABORT a SET ANSI WARNINGS zapnuté, tyto chybové podmínky způsobí ukončení dotazu.

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

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

Poznámka:

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

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

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

Když je SET ARITHABORT nebo SET ARITHIGNORE VYPNUTO a SET ANSI_WARNINGS ZAPNUTO, SQL Server stále zobrazí chybovou zprávu při výskytu chyb dělení nulou nebo přetečení.

Když je SET ARITHABORT vypnutý a během vyhodnocení Booleovské podmínky IF se objeví chyba přerušení, FALSE se větev vykoná.

NASTAVIT ARITHABORT musí být ZAPNUTÝ, když vytváříte nebo měníte indexy ve vypočtených sloupcích nebo indexovaných pohledech. Pokud je příkaz SET ARITHABORT vypnutý, příkazy CREATE, UPDATE, INSERT a DELETE u tabulek s indexy ve vypočítaných sloupcích nebo indexovaných pohledech selžou.

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

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

Pro zobrazení aktuálního nastavení SET 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