SET SET ARITHABORT (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Punkt końcowy analizy SQL w usłudze Microsoft FabricHurtownia danych w usłudze Microsoft FabricBaza 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 ON i SET 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 , jak OFF i błąd arytmetyczny, pojawia się komunikat ostrzegawczy (chyba że SET ARITHIGNORE jest ), ONa wynik operacji arytmetycznej to NULL.

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.

  1. Skrypt tworzy tabele t1 próbek i t2 wstawia wartości danych próbnych.
  2. Ustaw ANSI_WARNINGS ON i wykonaj testy, aby zobaczyć domyślne zachowanie błędu dzielenia przez zero oraz przepełnienia arytmetycznego.
  3. Ustaw tak, że ma ARITHABORT działanie, i ustaw .ANSI_WARNINGS OFFARITHABORT ON Wykonaj testy, aby zobaczyć zachowanie z błędem dzielenia przez zero i przepełnieniem arytmetycznym.
  4. Ustaw zarówno , ANSI_WARNINGS OFF jak i ARITHABORT OFF. Wykonaj testy, aby zobaczyć zachowanie z błędem dzielenia przez zero i przepełnieniem arytmetycznym.
  5. 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