Sql Server'ın hangi versiyonu ile çalışıyorsunuz bilmiyorum ama aslında Raiserror tam da istediğiniz şekilde çalışıyor maalesef. Bana kalırsa bu bir sorun, gerçek bir hata mekanizması değil. Neyse ki Sql Server 2012 'de gerçek bir hata mekanizmasını nihayet yapabildiler. throw ile yeni hata fırlatabiliyoruz ve gerçekten olması gerektiği gibi çalışıyor.
Kod: Tümünü seç
RAISERROR('Deneme Hata Mesajı-1', 16, 1)
PRINT 'Print Satırı-1'
RAISERROR('Deneme Hata Mesajı-2', 16, 1)
PRINT 'Print Satırı-2'
Yukarıdaki gibi bir kodda normalde (Delphi yada ona benzer dillerdeki exception mekanizması düşünüldüğünde) "Deneme Hata Mesajı-1" iletisini gördükten sonra başka bir şey görmememiz gerekir. Oysaki görüyoruz.! Sizde yeni bir Query penceresi açıp ilgili kodu oraya yapıştırarak test edebilirsiniz.
Benzer bir şekilde;
Kod: Tümünü seç
BEGIN TRY
RAISERROR('Deneme Hata Mesajı-1', 16, 1)
PRINT 'Print Satırı-1'
RAISERROR('Deneme Hata Mesajı-2', 16, 1)
PRINT 'Print Satırı-2'
END TRY
BEGIN CATCH
RAISERROR('Begin Catch Hata Mesajı-1', 16, 1)
PRINT 'Begin Catch Print Satırı-1'
RAISERROR('Begin Catch Hata Mesajı-2', 16, 1)
PRINT 'Begin Catch Print Satırı-2'
END CATCH
Yukarıdaki gibi bir kodda ise; aşağıdaki gibi bir sonuç ile karşılaşırsınız:
Msg 50000, Level 16, State 1, Line 8
Begin Catch Hata Mesajı-1
Begin Catch Print Satırı-1
Msg 50000, Level 16, State 1, Line 10
Begin Catch Hata Mesajı-2
Begin Catch Print Satırı-2
Görüldüğü üzere, BEGIN TRY içinde oluşan bir hata otomatikman BEGIN CATCH bloğuna dallanılmasına, ardından da ilgili satırların işletilmesine neden oluyor. Oysaki alışık olduğumuz exception yapısı bu şekilde işlemiyor. Normalde bir exception raise edildikten sonra altındaki satırların işletilmemesi gerekir. Bence bu hali ile Sql Server'da RaiseError kullanmak biraz dikkatli olmayı gerektiriyor. Çaresi ne mi; eğer Sql Server 2012 kullanıyorsanız
throw anahtar sözcüğüne bakmalısınız derim.