Aracılığıyla paylaş


ARITHABORT SETI (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ı

Sorgu yürütme sırasında taşma veya sıfıra böl hatası meydana geldiğinde sorgu sona erer.

Transact-SQL söz dizimi kuralları

Sözdizimi

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

SET ARITHABORT { ON | OFF }

Syntax for Azure Synapse Analytics and Analytics Platform System (PDW)

SET ARITHABORT ON

Açıklamalar

Giriş oturumlarınızda her zaman ARITHABORT'u ON'a ayarlayın. ARITHABORT'u KAPALı olarak ayarlamak, sorgu optimizasyonunu olumsuz etkileyebilir ve performans sorunlarına yol açabilir.

Uyarı

SQL Server Management Studio için varsayılan ARITHABORT ayarı ON'dur. ARITHABORT'u KAPALI olarak ayarlayan istemci uygulamaları farklı sorgu planları alabilir ve bu da kötü çalışan sorguların sorun gidermesini zorlaştırır. Yani, aynı sorgu Management Studio'da hızlı çalışabilir ama uygulamada yavaş olabilir. Management Studio ile soruları giderken her zaman istemci ARITHABORT ayarını eşleştirin.

SET ARITHABORT ve SET ANSI ALARMLARI AÇIKSA, bu hata koşulları sorguyu sonlandırır.

SET ARITHABORT AÇIK ve SET ANSI WARNINGS KAPALI olduğunda, bu hata koşulları partinin sona ermesine neden olur. Hatalar bir işlemde gerçekleşirse, işlem geri alınır. SET ARITHABORT KAPALI olduğunda ve bu hatalardan biri meydana geldiğinde, bir uyarı mesajı gelir ve aritmetik işlemin sonucu olur.NULL

Eğer SET ARITHABORT ve SET ANSI ALARMLARI KAPALIYSA VE BU HATALARDAN BIRI OLUŞURSA, BIR UYARı MESAJı GÖRÜNÜR VE ARITMETIK IŞLEMIN SONUCU OLUR NULL.

Uyarı

Eğer ne SET ARITHABORT ne de SET ARITHIGNORE AKONiksa, SQL Server geri döner NULL ve sorgu çalıştırıldıktan sonra bir uyarı mesajı görünür.

ANSI_WARNINGS değeri ON ve veritabanı uyumluluk seviyesi 90 veya daha yüksek olduğunda, ARITHABORT değer ayarı ne olursa olsun örtük olarak ONON'dur. Veritabanı uyumluluk seviyesi 80 veya daha öncesine ayarlanmışsa, ARITHABORT seçeneği açıkça ON olarak ayarlanmalıdır.

İfade değerlendirmesi için, SET ARITHABORT KAPALıysa ve bir INSERT, UPDATE veya DELETE ifadesi aritmetik, taşma, sıfıra bölme veya alan hatası ile karşılaşırsa, SQL Server 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 veya SET ARITHIGNORE KAPALI ve SET ANSI_WARNINGS AÇIKSA, SQL Server sıfıra bölme veya taşma hatalarıyla karşılaştığında yine bir hata mesajı döndürür.

SET ARITHABORT KAPALI olduğunda ve bir IF ifadesinin Boolean koşulu değerlendirilirken bir iptal hatası meydana geldiğinde, FALSE dal çalıştırılır.

ARITHABORT SET, hesaplanan sütunlarda veya indekslenmiş görünümlerde endeks oluştururken veya değiştirirken AÇIK olmalıdır. SET ARITHABORT KAPALI ise, hesaplanmış sütunlarda veya indekslenmiş görünümlerde indeks bulunan tablolarda oluştur, güncelleme, ekleme ve SIL ibetleri başarısız olur.

SET ARITHABORT ayarı, ayrıştırma zamanında değil, çalıştırma veya çalıştırma zamanında gerçekleşir.

SET ARITHABORT OFF Azure Synapse Analytics dedicated SQL pools'ta desteklenmiyor.

SET ARITHABORT için mevcut ayarı görüntülemek için aşağıdaki sorguyu çalıştırın:

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

Permissions

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

Örnekler

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

-- SET ARITHABORT  
-------------------------------------------------------------------------------  
-- Create tables t1 and t2 and insert data values.  
CREATE TABLE t1 (  
   a TINYINT,   
   b TINYINT  
);  
CREATE TABLE t2 (  
   a TINYINT  
);  
GO  
INSERT INTO t1   
VALUES (1, 0);  
INSERT INTO t1   
VALUES (255, 1);  
GO  
  
PRINT '*** SET ARITHABORT ON';  
GO  
-- SET ARITHABORT ON and testing.  
SET ARITHABORT ON;  
GO  
  
PRINT '*** Testing divide by zero during SELECT';  
GO  
SELECT a / b AS ab   
FROM t1;  
GO  
  
PRINT '*** Testing divide by zero during INSERT';  
GO  
INSERT INTO t2  
SELECT a / b AS ab    
FROM t1;  
GO  
  
PRINT '*** Testing tinyint overflow';  
GO  
INSERT INTO t2  
SELECT a + b AS ab   
FROM t1;  
GO  
  
PRINT '*** Resulting data - should be no data';  
GO  
SELECT *   
FROM t2;  
GO  
  
-- Truncate table t2.  
TRUNCATE TABLE t2;  
GO  
  
-- SET ARITHABORT OFF and testing.  
PRINT '*** SET ARITHABORT OFF';  
GO  
SET ARITHABORT OFF;  
GO  
  
-- This works properly.  
PRINT '*** Testing divide by zero during SELECT';  
GO  
SELECT a / b AS ab    
FROM t1;  
GO  
  
-- This works as if SET ARITHABORT was ON.  
PRINT '*** Testing divide by zero during INSERT';  
GO  
INSERT INTO t2  
SELECT a / b AS ab    
FROM t1;  
GO  
PRINT '*** Testing tinyint overflow';  
GO  
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.  
DROP TABLE t1;  
DROP TABLE t2;  
GO