SET SET ARITHABORT (Transact-SQL)

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSistem Platform Analitik (PDW)Titik akhir analitik SQL di Microsoft FabricGudang di Microsoft FabricDatabase SQL di Microsoft Fabric

Pengaturan menentukan SET ARITHABORT apakah kueri berhenti saat terjadi kesalahan overflow atau divide-by-zero selama eksekusi kueri.

  • Saat Anda mengatur SET ARITHABORT ON dan SET ANSI_WARNINGS OFF, kesalahan aritmatika menyebabkan batch berakhir. Jika kesalahan terjadi dalam transaksi, transaksi akan digulung balik.

  • Jika keduanya SET ARITHABORT dan SET ANSI_WARNINGS are OFF dan kesalahan aritmatika terjadi, pesan peringatan muncul (kecuali SET ARITHIGNORE adalah ON) dan hasil operasi aritmatika adalah NULL.

Konvensi sintaks transact-SQL

Sintaks

Sintaks untuk SQL Server, kumpulan SQL tanpa server di Azure Synapse Analytics, Microsoft Fabric, database SQL di Microsoft Fabric


SET ARITHABORT { ON | OFF }

Sintaks untuk Azure Synapse Analytics dan Analytics Platform System (PDW)


SET ARITHABORT ON

Keterangan

Ketika ANSI_WARNINGS ( ON default), pengaturan tidak ARITHABORT memiliki efek fungsional. Kesalahan aritmatika menyebabkan kueri berakhir, tetapi batch tidak dibatalkan (selama pengaturannya XACT_ABORT adalah OFF). Kesalahan aritmatika meliputi overflow, divide-by-zero, atau kesalahan domain.

Peringatan

Pengaturan default ARITHABORT untuk SQL Server Management Studio (SSMS) adalah ON, sedangkan koneksi klien dalam aplikasi default ke ARITHABORT OFF. Bahkan jika tidak ada perbedaan fungsional selama ANSI_WARNINGS , ONpengaturannya ARITHABORT masih merupakan kunci cache. Oleh karena itu, SSMS dan aplikasi sama-sama menggunakan defaultnya masing-masing, memiliki entri cache yang berbeda, dan mungkin mendapatkan rencana kueri yang berbeda, sehingga sulit untuk memecahkan masalah kueri yang berkinerja buruk. Artinya, kueri yang sama mungkin dijalankan lebih lambat di aplikasi daripada di SSMS. Saat memecahkan masalah kueri dengan Management Studio, selalu cocokkan setelan klien ARITHABORT .

Untuk evaluasi ekspresi, jika baik SET ANSI_WARNINGS dan SET ARITHABORT are OFF maupun INSERT, UPDATE, atau DELETE pernyataan menemukan kesalahan aritmatika, kueri akan menyisipkan atau memperbarui NULL nilai. Jika kolom target tidak dapat diubah ke null, tindakan sisipkan atau perbarui gagal dan pengguna melihat kesalahan.

Pengaturan terjadi SET ARITHABORT pada waktu eksekusi atau eksekusi dan bukan pada waktu penguraian.

SET ARITHABORT OFFtidak didukung di kumpulan SQL khusus Azure Synapse Analytics.

Izin

Memerlukan keanggotaan dalam peran publik .

Lihat pengaturan saat ini ARITHABORT

Untuk melihat pengaturan saat ini untuk SET ARITHABORT, jalankan kueri T-SQL berikut:

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

Contoh

Contoh berikut menunjukkan kesalahan divide-by-zero dan overflow dengan pengaturan yang berbeda SET ARITHABORT .

  1. Skrip membuat tabel t1 sampel dan t2 menyisipkan nilai data sampel.
  2. Atur ANSI_WARNINGS ON dan jalankan pengujian untuk melihat perilaku default kesalahan bagi dengan nol dan luapan aritmatika.
  3. Atur ANSI_WARNINGS OFF sehingga berpengaruh ARITHABORT , dan atur ARITHABORT ON. Jalankan pengujian untuk melihat perilaku dengan kesalahan divide-by-zero dan arithmetic overflow.
  4. Atur keduanya ANSI_WARNINGS OFF dan ARITHABORT OFF. Jalankan pengujian untuk melihat perilaku dengan kesalahan divide-by-zero dan arithmetic overflow.
  5. Bersihkan tabel sampel.
-- 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