Örneklerimde AdventureWorks2012 veritabanını kullanacağım.
Örnek : HumanResources.Department tablosuna çift kayıt girmeye çalışacağım. Buradaki hatayı yakalamak için @@ERROR fonksiyonunu kullanacağım.
DECLARE @HataNumarasi INT; INSERT INTO HumanResources.Department(DepartmentID,Name,GroupName,ModifiedDate) VALUES(1,'Engineering','Research and Development',GETDATE()); SET @HataNumarasi = @@ERROR; IF @HataNumarasi > 0 BEGIN PRINT @HataNumarasi; END;
Şimdi örneğimde HataNumarasi adında INT tipinde bir değişken tanımladım. Ve HumanResources.Department tablosunda 1 nolu kayıt olduğunu biliyorum ama ben bilerek hatalı kod yazmak için tekrar 1 nolu satıra veri girişi yapmaya çalışıyorum. HataNumarası değişkenim ile birlikte @ERROR fonksiyonunu bağlıyorum. Eğer hata mevcut olursa geriye bu fonksiyon sonucunda 0’dan büyük bir sayı döner, bu durumu IF ile kontrol ediyorum. Eğer hata var ise 0’dan büyük sayı dönecek ve ben de bunu ekrana yazdırıyorum. Sonuç aşağıdaki gibi:
Örnek : Bir üstteki örneğimdeki işlemi bu sefer TRY CATCH ile yapayım. Ama PRINT kısmında aynı zamanda hata numarasını, hata mesajını ve hata şiddetini yazdıralım. Kodlarımı şimdi düzenliyorum.
BEGIN TRY INSERT INTO HumanResources.Department(DepartmentID,Name,GroupName,ModifiedDate) VALUES(1,'Engineering','Research and Development',GETDATE()); END TRY BEGIN CATCH SELECT ERROR_NUMBER() AS HataNumarasi, ERROR_MESSAGE AS HataMesaji, ERROR_SEVERITY AS HataSiddeti END CATCH;
Bir önceki yazımda belirttiğim üzere TRY CATCH ile bu sefer hatayı yakalayamıyorum.
Örnek : Bu sefer bir üstteki örneğim için TRY CATCH yapısı içinde hatayı kendi mesajımla yazdırmaya çalışayım. Bunun için RAISERROR kullanmam gerekiyor. Kodları yazarsak;
BEGIN TRY INSERT INTO HumanResources.Department(DepartmentID,Name,GroupName,ModifiedDate) VALUES(1,'Engineering','Research and Development',GETDATE()); END TRY BEGIN CATCH RAISERROR('Var olan satır üzerine veri girmeye çalıştınız',16,1); END CATCH;
Sonuç :
Görüleceği üzere kendi mesajımızı yazdırdık.