SQL Server hatalarını işlemek için TL ... CATCH adım adım bir kılavuz

Çalışmayı kesintiye uğratmadan hataları tespit edin

Transact-SQL'teki TL… CATCH ifadesi veritabanı uygulamalarınızdaki hata koşullarını algılar ve işler. Bu ifade, SQL Server hata işlemenin temel taşıdır ve sağlam veritabanı uygulamalarının geliştirilmesinin önemli bir parçasıdır. TRY ... CATCH, 2008, Azure SQL Veritabanı, Azure SQL Veri Ambarı ve Paralel Veri Ambarı ile başlayan SQL Server'a uygulanır.

Tanıtımı TL..CATCH

TRY ... CATCH, iki Transact-SQL deyimi belirtmenize izin vererek çalışır: "denemek" istediğiniz ve ortaya çıkabilecek herhangi bir hatayı "yakalamak" için kullanmak için başka bir. SQL Server, bir TL ... CATCH deyimi ile karşılaştığında, hemen TL yan tümcesinde bulunan deyimi yürütür. TRY deyimi başarıyla yürütürse, SQL Server yalnızca devam eder. Ancak, TRY deyimi bir hata oluşturuyorsa, SQL Server, hatasız bir şekilde ele almak için CATCH deyimini yürütür.

Temel sözdizimi bu formu alır:

BEGIN TRY {sql_statement | statement_block} END BAŞLANGIÇ BEKLENTİ [{sql_statement | statement_block}] END CATCH [; ]

TRY ... CATCH Örneği

Bu ifadenin kullanımını bir örnek kullanarak anlamak en kolay yoldur. Kuruluşunuzdaki çalışanların her biri hakkında bilgi içeren "Çalışanlar" adlı bir tablo içeren bir insan kaynakları veritabanının yöneticisi olduğunuzu düşünün. Bu tablo birincil anahtar olarak bir tamsayı çalışan ID numarası kullanır. Veritabanınıza yeni bir çalışan eklemek için aşağıdaki ifadeyi kullanmaya çalışabilirsiniz:

INSERT INTO çalışanları (id, first_name, last_name, extension) DEĞERLER (12497, 'Mike', 'Chapple', 4201)

Normal şartlar altında, bu ifade Çalışanlar tablosuna bir satır ekler. Ancak, 12497 kimliğine sahip bir çalışan veritabanında zaten varsa, satırın eklenmesi birincil anahtar kısıtlamasını ihlal eder ve aşağıdaki hatayı verir:

Msg 2627, Level 14, State 1, Line 1 PRIMARY KEY kısıtlaması 'PK_employee_id' ihlali. 'Dbo.employees' nesnesine çift anahtar eklenemiyor. Açıklama feshedildi.

Bu hata, sorunu gidermek için gereken bilgileri size sağlarken, bununla ilgili iki sorun vardır. İlk olarak, mesaj şifreli. Hata kodlarını, satır numaralarını ve ortalama kullanıcı için anlaşılmaz diğer bilgileri içerir. İkincisi ve daha da önemlisi, ifadenin iptal edilmesine neden olur ve bir uygulama çökmesine neden olabilir.

Alternatif, aşağıdaki gibi bir ifadeyi TL… CATCH ifadesine sarmaktır:

BEGIN INTOERS INTO INTOVER çalışanları (id, first_name, last_name, extension) DEĞERLER (12497, 'Mike', 'Chapple', 4201) END BAŞLANGIÇ BAŞLAYIN CATCH BASKI 'Hata:' + ERROR_MESSAGE (); EXEC msdb.dbo.sp_send_dbmail @profile_name = 'Çalışan Mail', @recipients = 'hr@foo.com', @body = 'Yeni bir çalışan kaydı oluştururken bir hata oluştu.', @subject = 'Çalışan Kimliği Kopyalama Hatası'; END ÇEKME

Bu örnekte, ortaya çıkan hatalar hem komutu çalıştıran kullanıcıya hem de hr@foo.com e-posta adresine bildirilir. Kullanıcıya gösterilen hata aşağıdaki gibi görünür:

Hata: PRIMARY KEY kısıtlaması 'PK_employee_id' ihlali. 'Dbo.employees' nesnesine çift anahtar eklenemiyor. Posta sıraya alındı.

En önemlisi, uygulama yürütme normal olarak devam eder ve programcının hatasız bir şekilde ele alınmasına izin verir. TRY ... CATCH ifadesinin kullanılması, SQL Server veritabanı uygulamalarında oluşan hataları proaktif olarak algılamak ve işlemek için zarif bir yoldur.

Daha Fazlası

Yapısal Sorgu Dili hakkında daha fazla bilgi edinmek isterseniz, SQL'e Giriş okuyun.