SET SET ARITHABORT (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiAzure Synapse AnalyticsAnaliz Platformu Sistemi (PDW)Microsoft Fabric'teki SQL analiz uç noktasıMicrosoft Fabric'teki ambarMicrosoft Fabric'teki SQL veritabanı

Ayar, SET ARITHABORT sorgu yürütme sırasında taşma veya sıfıra böl hatası olduğunda sorgu durup durmadığını belirler.

  • ve SET ANSI_WARNINGS OFFayarladığınızdaSET ARITHABORT ON, aritmetik hatalar partinin sona ermesine neden olur. Hatalar bir işlemde gerçekleşirse, işlem geri alınır.

  • Hem de ve aritmetik bir hata gerçekleşirse, bir uyarı mesajı çıkar (eğer SET ARITHIGNORE ise ON) ve aritmetik işlemin sonucu olurNULL.OFFSET ANSI_WARNINGSSET ARITHABORT

Transact-SQL söz dizimi kuralları

Sözdizimi

Syntax for SQL Server, serverless SQL pool in Azure Synapse Analytics, Microsoft Fabric, SQL database in Microsoft Fabric


SET ARITHABORT { ON | OFF }

Azure Synapse Analytics ve Analytics Platform Sistemi (PDW) için söz dizimi


SET ARITHABORT ON

Açıklamalar

Varsayılan, ANSI_WARNINGS ' ON ayarının ARITHABORT işlevsel bir etkisi yoktur. Aritmetik hatalar sorguyu sonlandırır, ancak parti sona ermez (ayar XACT_ABORTOFFolduğu sürece).

Uyarı

SQL Server Management Studio (SSMS) ONiçin varsayılan ARITHABORT ayar , iken bir uygulamadaki istemci bağlantısı varsayılan olarak ARITHABORT OFF. Fonksiyonel bir fark ANSI_WARNINGSONolmasa bile, ARITHABORT ayar yine de önbellek anahtarıdır. Bu nedenle, SSMS ve bir uygulama, kendi varsayılan ayarlarını kullandığında, farklı önbellek girişlerine sahip olabilir ve farklı sorgu planları alabilir, bu da kötü performans gösteren sorguları sorun gidermeyi zorlaştırır. Yani, aynı sorgu uygulamada SSMS'e göre daha yavaş çalışabilir. Management Studio ile soruları giderken her zaman istemci ARITHABORT ayarını eşleştirin.

İfade değerlendirmesi için, hem SET ANSI_WARNINGS hem de SET ARITHABORT bir OFFINSERT, UPDATE, veya DELETE ifade aritmetik, taşma, sıfıra bölme veya alan hatasına rast gelirse, sorgu bir NULL değer ekler veya günceller. Hedef sütun nullable değilse, ekleme veya güncelleme eylemi başarısız olur ve kullanıcı hata görür.

' SET ARITHABORT ayarı işlem zamanında gerçekleşir, ayrıştırma zamanında değil.

SET ARITHABORT OFFAzure Synapse Analytics dedicated SQL havuzlarında desteklenmiyor.

Permissions

"" genel "" rolüne üyelik gerektirir.

Mevcut ayarını görüntüleyin ARITHABORT

Mevcut ayarını görüntülemek SET ARITHABORTiçin aşağıdaki T-SQL sorgusunu çalıştırın:

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

Örnekler

Aşağıdaki örnek, farklı SET ARITHABORT ayarlarda sıfıra bölme ve taşma hatalarını göstermektedir.

  1. Script örnek tablolar t1 oluşturur ve t2 örnek veri değerleri ekler.
  2. Sıfıra böl hata ve aritmetik taşmanın varsayılan davranışını görmek için testler ayarlayın ANSI_WARNINGS ON ve çalıştırın.
  3. Bunun etkisi olacak şekilde ayarlayın ANSI_WARNINGS OFFARITHABORT ve ARITHABORT ONayarlayın. Davranışı sıfıra böl hatası ve aritmetik taşma ile testler yapın.
  4. Her ikisini ANSI_WARNINGS OFF de ve ARITHABORT OFFayarlayın. Davranışı sıfıra böl hatası ve aritmetik taşma ile testler yapın.
  5. Numune tablolarını temizleyin.
-- 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