Skip to main content

ใช้ TRY ... จับเพื่อจัดการกับข้อผิดพลาดของ SQL Server

Anonim

คำสั่ง TRY … CATCH ใน Transact-SQL จะตรวจจับและจัดการกับเงื่อนไขข้อผิดพลาดในแอ็พพลิเคชันฐานข้อมูล คำสั่งนี้เป็นรากฐานสำคัญของการจัดการข้อผิดพลาดของ SQL Server และเป็นส่วนสำคัญในการพัฒนาแอพพลิเคชันฐานข้อมูลที่มีประสิทธิภาพ TRY … CATCH ใช้กับ SQL Server เริ่มต้นด้วย 2008, Azure SQL Database, Azure SQL Data Warehouse และ Parallel Data Warehouse

แนะนำ TRY … CATCH

TRY … CATCH ทำงานโดยให้คุณระบุคำสั่ง Transact-SQL สองคำ: แบบที่คุณต้องการ "try" และอีกคำหนึ่งที่จะใช้เพื่อ "จับ" ข้อผิดพลาดที่อาจเกิดขึ้น เมื่อ SQL Server พบคำสั่ง TRY … CATCH ทันทีจะรันคำสั่งที่รวมอยู่ใน TRY clause ถ้าคำสั่ง TRY รันเสร็จเรียบร้อยแล้ว SQL Server จะย้ายมา อย่างไรก็ตามถ้าคำสั่ง TRY สร้างข้อผิดพลาด SQL Server รันคำสั่ง CATCH เพื่อจัดการข้อผิดพลาดอย่างงดงาม

ไวยากรณ์พื้นฐานใช้รูปแบบนี้:

BEGIN TRY block คำสั่ง END TRYBEGIN CATCHsql_statementEND CATCH ;

ลองตัวอย่างเช่น CATCH

เข้าใจง่ายในการใช้คำสั่งนี้ผ่านตัวอย่าง ลองจินตนาการว่าคุณเป็นผู้ดูแลระบบฐานข้อมูลทรัพยากรมนุษย์ที่มีตารางชื่อ "Employees" ซึ่งมีข้อมูลเกี่ยวกับพนักงานแต่ละคนในองค์กรของคุณ ตารางนั้นใช้หมายเลขรหัสพนักงานเป็นจำนวนเต็มเป็นคีย์หลัก คุณอาจลองใช้คำสั่งด้านล่างเพื่อแทรกพนักงานใหม่ลงในฐานข้อมูลของคุณ:

พนักงาน INSERT INTO (id, first_name, last_name, extension)ค่า (12497, 'ไมค์', 'Chapple', 4201)

ภายใต้สถานการณ์ปกติคำสั่งนี้จะเพิ่มแถวลงในตารางพนักงาน อย่างไรก็ตามถ้าพนักงานที่มี ID 12497 มีอยู่แล้วในฐานข้อมูลการแทรกแถวจะละเมิดข้อ จำกัด ของคีย์หลักและทำให้เกิดข้อผิดพลาดต่อไปนี้:

ข่าวสารเกี่ยวกับ 2627, ระดับ 14, รัฐ 1, บรรทัดที่ 1การละเมิดข้อ จำกัด ของคีย์หลัก 'PK_employee_id' ไม่สามารถแทรกคีย์ซ้ำในวัตถุ 'dbo.employees' ได้คำชี้แจงนี้ถูกยกเลิกแล้ว

แม้ว่าข้อผิดพลาดนี้จะให้ข้อมูลที่จำเป็นสำหรับการแก้ไขปัญหา แต่ปัญหานี้มีอยู่สองข้อ ขั้นแรกให้ข้อความมีความคลุมเครือ ประกอบด้วยรหัสข้อผิดพลาดหมายเลขบรรทัดและข้อมูลอื่น ๆ ที่ผู้ใช้ทั่วไปไม่สามารถเข้าใจได้ ประการที่สองและที่สำคัญยิ่งกว่านั้นก็คือทำให้คำสั่งนี้ถูกยกเลิกและอาจทำให้แอพพลิเคชันเกิดความผิดพลาดได้ทางเลือกคือการตัดงบในคำสั่ง TRY … CATCH ดังที่แสดงไว้ที่นี่:

BEGIN TRYพนักงาน INSERT INTO (id, first_name, last_name, extension)ค่า (12497, 'ไมค์', 'Chapple', 4201)END TRYBEGIN CATCHPRINT 'ERROR:' + ERROR_MESSAGE ();EXEC msdb.dbo.sp_send_dbmail@profile_name = 'จดหมายลูกจ้าง'@recipients = '[email protected]',@body = 'เกิดข้อผิดพลาดในการสร้างเร็กคอร์ดใหม่ของพนักงาน',@subject = 'ข้อผิดพลาดในการทำสำเนา ID พนักงาน';END CATCH

ในตัวอย่างนี้ข้อผิดพลาดใด ๆ ที่เกิดขึ้นจะรายงานไปยังผู้ใช้ที่ทำการคำสั่งและที่อยู่อีเมล [email protected] ข้อผิดพลาดที่แสดงต่อผู้ใช้คือ:

ข้อผิดพลาด: การละเมิดข้อ จำกัด ของคีย์หลัก 'PK_employee_id' ไม่สามารถแทรกคีย์ซ้ำในวัตถุ 'dbo.employees' ได้จดหมายที่เข้าคิว

การดำเนินการแอ็พพลิเคชันยังดำเนินต่อไปตามปกติทำให้โปรแกรมเมอร์สามารถจัดการกับข้อผิดพลาดได้ การใช้คำสั่ง TRY … CATCH เป็นวิธีที่ชาญฉลาดในการตรวจจับและจัดการข้อผิดพลาดที่เกิดขึ้นในโปรแกรมประยุกต์ฐานข้อมูล SQL Server ในเชิงรุก

เรียนรู้เพิ่มเติม

ถ้าคุณต้องการเรียนรู้เพิ่มเติมเกี่ยวกับ Structured Query Language ให้ดูที่ Introduction to SQL