Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Platí pro:SQL Server
Azure SQL Database
Spravovaná instance Azure SQL
Azure Synapse Analytics
Analytics Platform System (PDW)
Koncový bod analýzy SQL v Microsoft Fabric
Sklad v Microsoft Fabric
Databá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 ONaSET 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 (pokudSET ARITHIGNOREnení )ONa výsledek aritmetické operace jeNULL.OFFSET ANSI_WARNINGS
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.
- Skript vytváří ukázkové tabulky
t1at2vkládá vzorkové datové hodnoty. - Nastavte
ANSI_WARNINGS ONa spusťte testy, abyste zjistili výchozí chování chyby dělení nulou a přetečení aritmetiky. - Nastavte tak, že má
ARITHABORTúčinek, a nastavitANSI_WARNINGS OFF.ARITHABORT ONProveďte testy, abyste zjistili chování s chybou dělení nulou a přetečením aritmetiky. - 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. - 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