คำแนะนำทีละขั้นตอนเพื่อใช้งาน TRY ... จับเพื่อจัดการกับข้อผิดพลาดของ SQL Server

ระบุข้อผิดพลาดโดยไม่รบกวนการทำงาน

คำสั่ง 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 {sql_statement | statement_block} END TRY BEGIN CATCH [{sql_statement | statement_block}] END CATCH [; ]

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

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

พนักงาน INSERT INTO (id, first_name, last_name, extension) VALUES (12497, 'Mike', '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) VALUES (12497, 'Mike', 'Chapple', 4201) END TRY BEGIN CATCH PRINT 'Error:' + ERROR_MESSAGE (); EXEC msdb.dbo.sp_send_dbmail @profile_name = 'Employee Mail,' @recipients = 'hr@foo.com', @body = 'มีข้อผิดพลาดเกิดขึ้นในการสร้างเร็กคอร์ดใหม่', @subject = 'Employee ID Duplication Error'; END CATCH

ในตัวอย่างนี้ข้อผิดพลาดใด ๆ ที่เกิดขึ้นจะรายงานไปยังผู้ใช้ที่ทำการคำสั่งและที่อยู่อีเมล hr@foo.com ข้อผิดพลาดที่แสดงต่อผู้ใช้ปรากฏด้านล่าง:

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

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

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

ถ้าคุณต้องการเรียนรู้เพิ่มเติมเกี่ยวกับ Structured Query Language โปรดอ่าน บทนำสู่ SQL