Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Punkt końcowy analizy SQL w usłudze Microsoft Fabric
Hurtownia danych w usłudze Microsoft Fabric
Baza danych SQL w usłudze Microsoft Fabric
Ustawienie to określa, SET ARITHABORT czy zapytanie zatrzymuje się, gdy podczas wykonywania zapytania wystąpi błąd przepełnienia lub dzielenia przez zero.
Gdy ustawisz
SET ARITHABORT ONiSET ANSI_WARNINGS OFF, błędy arytmetyczne powodują zakończenie partii. Jeśli błędy wystąpią w transakcji, transakcja jest cofana do tyłu.Jeśli wystąpią zarówno i
SET ARITHABORTSET ANSI_WARNINGS, jakOFFi błąd arytmetyczny, pojawia się komunikat ostrzegawczy (chyba żeSET ARITHIGNOREjest ),ONa wynik operacji arytmetycznej toNULL.
Transact-SQL konwencje składni
Składnia
Składnia dla SQL Server, serwerless SQL pool w Azure Synapse Analytics, Microsoft Fabric, SQL database in Microsoft Fabric
SET ARITHABORT { ON | OFF }
Składnia dla usługi Azure Synapse Analytics i systemu platformy analizy (PDW)
SET ARITHABORT ON
Uwagi
Gdy ANSI_WARNINGS jest ( ON domyślnie), ustawienie nie ARITHABORT ma efektu funkcjonalnego. Błędy arytmetyczne powodują zakończenie zapytania, ale partia nie zostaje przerwana (o ile ustawienie XACT_ABORT jest ).OFF
Ostrzeżenie
Domyślne ARITHABORT ustawienie SQL Server Management Studio (SSMS) to ON, podczas gdy połączenie klienta w aplikacji domyślnie przyjmuje .ARITHABORT OFF Nawet jeśli nie ma żadnej funkcjonalnej różnicy, dopóki ANSI_WARNINGS jest , ONustawienie ARITHABORT nadal jest kluczem cache. Dlatego SSMS i aplikacja, korzystające ze swoich domyślnych ustawień, mają różne wpisy pamięci podręcznej i mogą otrzymywać różne plany zapytań, co utrudnia rozwiązywanie problemów z źle działającymi zapytaniami. Oznacza to, że to samo zapytanie może być wykonywane wolniej w aplikacji niż w SSMS. Podczas rozwiązywania zapytań w Management Studio zawsze dostosuj ustawienia klienta ARITHABORT .
Dla oceny wyrażeń, jeśli zarówno SET ANSI_WARNINGS i , SET ARITHABORTOFF jak i INSERT, UPDATE, lub DELETE instrukcje napotkają błąd arytmetyczny, przepełnienie, dzielenie przez zero lub błąd dziedziny, zapytanie wstawia lub aktualizuje wartość NULL . Jeśli kolumna docelowa nie jest unieważnialna, akcja wstawienia lub aktualizacji kończy się niepowodzeniem i użytkownik widzi błąd.
Ustawienie pojawia SET ARITHABORT się podczas wykonywania lub działania, a nie podczas parsowania.
SET ARITHABORT OFFnie jest wspierany w dedykowanych pulach SQL Azure Synapse Analytics.
Permissions
Wymaga członkostwa w publicznej roli .
Zobacz aktualne ustawienia ARITHABORT
Aby zobaczyć aktualne ustawienie dla SET ARITHABORT, wykonaj następujące zapytanie T-SQL:
DECLARE @ARITHABORT VARCHAR(3) = 'OFF';
IF ( (64 & @@OPTIONS) = 64 ) SET @ARITHABORT = 'ON';
SELECT @ARITHABORT AS ARITHABORT;
Przykłady
Poniższy przykład demonstruje błędy dzielenia przez zero i przepełnienia przy różnych SET ARITHABORT ustawieniach.
- Skrypt tworzy tabele
t1próbek it2wstawia wartości danych próbnych. - Ustaw
ANSI_WARNINGS ONi wykonaj testy, aby zobaczyć domyślne zachowanie błędu dzielenia przez zero oraz przepełnienia arytmetycznego. - Ustaw tak, że ma
ARITHABORTdziałanie, i ustaw .ANSI_WARNINGS OFFARITHABORT ONWykonaj testy, aby zobaczyć zachowanie z błędem dzielenia przez zero i przepełnieniem arytmetycznym. - Ustaw zarówno ,
ANSI_WARNINGS OFFjak iARITHABORT OFF. Wykonaj testy, aby zobaczyć zachowanie z błędem dzielenia przez zero i przepełnieniem arytmetycznym. - Posprzątaj tabele próbek.
-- 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