SQL sunucusunda toplu iptal hatalarının listesi


9

SQL Server'da, XACT_ABORT kapalıysa, bazı hatalar geçerli ifadeyi sonlandıracaktır (örneğin, bazı parametreleri alan saklı bir yordama hatalı sayıda parametre sağlama) ve bazı hatalar tüm toplu işi iptal edecektir (örneğin depolanan bir parametreye parametre sağlama) parametreleri almayan prosedür). [Referans]: http://www.sommarskog.se/error-handling-I.html#scope- abortion .

Ne bilmek istiyorum hangi hataları toplu iptal ve hangilerinin deyim sonlandırılıyor kesin bir listesi olup olmadığıdır.

Yanıtlar:


6

Birkaç istisna vardır, ancak Veritabanı Altyapısı Hata Önemleri (MSDN) inanıyorum :

Şiddet seviyesi 19 veya daha yüksek olan hata mesajları geçerli toplu işin yürütülmesini durdurur.

Veritabanı bağlantısını sonlandıran, genellikle 20 ile 25 arasındaki önem derecesine sahip hatalar, bağlantı sona erdiğinde yürütme durdurulduğundan CATCH bloğu tarafından işlenmez.

Bu nedenle, aşağıdaki sorgudan kesin bir liste alabilirsiniz gibi görünüyor (tabii ki bu, hangilerinin kullanıcı T-SQL'in neden olabileceğini filtrelemenize izin vermeyecektir):

SELECT message_id, severity, [text]
FROM sys.messages
WHERE language_id = 1033 
AND severity >= 19
ORDER BY severity, message_id;

SQL Server 2012'de, bu 210 satır üretir.

SQL Server 2016'da, bu 256 satır üretir.

Bu arada, sorunuzda açıkladığınız iki senaryonun düşündüğünüz gibi çalıştığına inanmıyorum, en azından SQL Server'ın modern sürümlerinde değil. Bunu hem 2012 hem de 2016'da denedim (Erland'ın makalesinde, farklı olup olmadığını hatırlamıyorum SQL Server 2000 davranışı açıkladığına inanıyorum, ancak bugün bile çok alakalı değil).

USE tempdb;
GO

CREATE PROCEDURE dbo.pA -- no parameters
AS PRINT 1
GO
CREATE PROCEDURE dbo.pB -- two parameters
@x INT, @y INT
AS PRINT 1
GO

SET XACT_ABORT OFF;
GO

EXEC dbo.pA @foo = 1; 
PRINT '### Calling procedure that doesn''t take parameters with a parameter';
GO

EXEC dbo.pB; 
PRINT '### Calling procedure that takes 2 parameters with no parameters';
GO

EXEC dbo.pB @x = 1; 
PRINT '### Calling procedure that takes 2 parameters with not enough parameters';
GO

EXEC dbo.pB @x = 1, @y = 2, @z = 3; 
PRINT '### Calling procedure that takes 2 parameters with too many parameters';
GO

Bunların tümü, önem seviyesi 16'daki hatalar üretir ve hepsi, baskı çıktısında kanıtlandığı gibi toplu işle devam eder:

Msg 8146, Seviye 16, Durum 2, Prosedür pA, Hat 11
Prosedür pA'da parametre yok ve argümanlar sağlandı.
###
Msg 201, Seviye 16, Durum 4, Prosedür pB, Hat 14 parametresi ile parametre almayan çağrı prosedürü
Prosedür veya fonksiyon 'pB', sağlanmayan '@x' parametresini bekliyor.
### Parametresiz 2 parametre alan çağrı prosedürü
Msg 201, Seviye 16, Durum 4, Prosedür pB, Hat 18
Prosedür veya fonksiyon 'pB', sağlanmayan '@y' parametresini bekliyor.
### Yeterli parametreye sahip olmayan 2 parametre alan çağrı prosedürü
Msg 8144, Seviye 16, Durum 2, Prosedür pB, Hat 22
Prosedür veya fonksiyon pB'de çok fazla argüman belirtildi.
### Çok fazla parametreyle 2 parametre alan çağrı prosedürü

Şüphelendiğim gibi, elbette yorumlarda belirtildiği gibi istisnalar var. Dönüşüm hatası önem derecesi 16'dır, ancak toplu işi iptal eder:

SET XACT_ABORT OFF;
SELECT CONVERT (INT, 'foo');
PRINT 'Made it.'; -- no print happens

Sonuçlar şu anda baskı çıktısını içermiyor:

Msg 245, Seviye 16, Durum 1
'foo' varchar değeri int veri türüne dönüştürülürken dönüşüm başarısız oldu.


Çok teşekkür ederim! Önceden tutarsızlık nedeniyle şiddet seviyesini bir gösterge olarak kullanamayacağımı düşündüm. Durum böyle olmadığını duyduğuma sevindim.
Jamie Alford

Aargh! Toplu işi durduracak bazı önem seviyesi 16 hataları vardır. Ben seçer ve yürütürsem: start tran print @@ TRANCOUNT print convert (int, 'abc') ve ardından şunu yazdır: print @@ TRANCOUNT Bir seviye 16 hatası olacak, ancak grup iptal edilecektir.
Jamie Alford

BTW, istisnanın beyan edilen durumdan farklı bir ciddiyetle ortaya çıktığı vakaları keşfederseniz, lütfen bunları bağlantı yoluyla bildirin
Remus Rusanu

2

@Aaron tarafından not edilen hata türlerine (yani Önem Düzeyi> = 19 ve dönüşüm hataları) ek olarak, TRY ... CATCH için MSDN sayfasında belirtilen aşağıdaki hata türleri de bir toplu işlemi iptal edecektir:

Aşağıdaki hata türleri TRY… CATCH yapısıyla aynı yürütme düzeyinde gerçekleştiğinde bir CATCH bloğu tarafından işlenmez:

  • Bir toplu işin çalışmasını engelleyen sözdizimi hataları gibi hataları derleyin.

  • Ertelenmiş ad çözümlemesi nedeniyle derlemeden sonra oluşan nesne adı çözümleme hataları gibi, deyim düzeyinde yeniden derleme sırasında oluşan hatalar.

Bu hatalar, toplu işi, saklı yordamı veya tetikleyiciyi çalıştıran düzeye döndürülür.

Aşağıdaki örneklerde, bunların üçünün Şiddet Seviyesi 15 olduğunu bile unutmayın.

ÖRNEK 1

SET XACT_ABORT OFF;
SELECT @NotDeclared; -- parse error
PRINT 'Do you see me?';

İadeler:

Msg 137, Seviye 15, Durum 2, Satır 2
Skaler değişkeni "@ NotDeclared" olarak bildirilmelidir.

ÖRNEK 2

SET XACT_ABORT OFF;
InvalidSQL; -- parse error
PRINT 'Do you see me?';

İadeler:

Msg 102, Seviye 15, Durum 1, Satır 2
'InvalidSQL' yakınında yanlış sözdizimi.

ÖRNEK 3

SET XACT_ABORT OFF;
SELECT 1 -- statement preceding THROW not terminated by semicolon
THROW 50505, N'Error, yo', 1; -- parse error
PRINT 'Do you see me?';

İadeler:

Msg 102, Seviye 15, Durum 1, Hat 3
'50505' yakınında yanlış sözdizimi.

ÖRNEK 4

SET XACT_ABORT OFF;
SELECT NoSuchColumn FROM sys.objects; -- compilation error
PRINT 'Do you see me?';

İadeler:

Msg 207, Seviye 16, Durum 1, Satır 3
Geçersiz sütun adı 'NoSuchColumn'.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.