Bất cứ khi nào chúng tôi viết một truy vấn, nó sẽ được kiểm tra lỗi cú pháp trước khi thực hiện. Nếu đúng cú pháp, nó sẽ được biên dịch và thực thi. Nhưng làm thế nào để một lỗi trở thành một ngoại lệ? . Lỗi xảy ra trong thời gian chạy được gọi là Ngoại lệ
Chúng ta hãy xem xét một ví dụ về bảng có tên là EmployeeDetails. Ở đây trong bảng này, coi cột EmployeeID là Khóa chính. Bây giờ nếu chúng tôi cố gắng chèn một hàng mới với dữ liệu đã tồn tại EmployeeID thì nó sẽ tạo ra một ngoại lệ
Các lỗi được tạo trong khi thực thi các câu lệnh SQL có thể được xử lý bằng cách sử dụng cấu trúc TRY-CATCH
Bạn có thể sử dụng khối Try Catch cho bất kỳ câu lệnh DML nào, bất kỳ phép gán nào hoặc trong việc lựa chọn dữ liệu hoặc với các phép nối SQL hoặc Bên ngoài hoặc Áp dụng chéo
CỐ GẮNG BẮT
Cấu trúc TRY-CATCH bao gồm khối TRY theo sau là khối CATCH. Nếu xảy ra lỗi trong bất kỳ câu lệnh nào của khối TRY, quyền điều khiển được chuyển đến khối CATCH, sau đó câu lệnh trong khối đó được thực thi
Nếu không có lỗi trong mã trong khối TRY, thì điều khiển được chuyển đến câu lệnh ngay sau câu lệnh END CATCH. Vì vậy, các câu lệnh được đặt trong khối CATCH không được thực thi
Dưới đây là cú pháp khối Try Catch
BEGIN TRY --Sql Statements END TRY BEGIN CATCH --Sql Statements to handle error END CATCH
Trước khi tiếp tục, chúng ta nên biết các chức năng do hệ thống xác định xử lý lỗi khác nhau
- ERROR_LINE[]. trả về số dòng xảy ra lỗi
- THÔNG BÁO LỖI[]. chỉ định văn bản của tin nhắn. Văn bản bao gồm giá trị được cung cấp cho bất kỳ tham số nào, chẳng hạn như độ dài, tên đối tượng hoặc thời gian
- SỐ LỖI[]. trả về số lỗi
- ERROR_PROCEDURE[]. trả về tên của thủ tục được lưu trữ hoặc trình kích hoạt nơi xảy ra lỗi và trả về NULL nếu lỗi không xảy ra trong quy trình hoặc trình kích hoạt được lưu trữ
- ERROR_SEVERITY[]. trả lại mức độ nghiêm trọng
- ERROR_STATE[]. trả về trạng thái của lỗi
Ví dụ. Để xem hoạt động của việc xử lý ngoại lệ, chúng ta hãy cố tình nêu ra một. Xem xét bảng EmployeeDetails. Ở đây trong bảng này, cột EmpID là PrimaryKey. Để đưa ra một ngoại lệ, chúng tôi sẽ cố gắng chèn một hàng mới với EmpID đã được cung cấp
SELECT * FROM EmployeeDetails
Truy vấn được cung cấp dưới đây cho thấy, tên bảng đó EmployeeDetails chứa ràng buộc Khóa chính
SELECT CONSTRAINT_NAME, TABLE_SCHEMA, TABLE_NAME, CONSTRAINT_TYPE FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_NAME='EmployeeDetails'
Bây giờ, khi viết mã đã cho bên dưới, chúng tôi đang cố tình chèn một bản ghi có cùng EmpID đã tồn tại. Vì vậy, trong trường hợp này, cú pháp của câu lệnh INSERT sẽ đúng nhưng ngoại lệ sẽ tăng lên khi chèn bản ghi. Do đó, chúng tôi sẽ sử dụng khối TRY-CATCH. Trong mã khối TRY được viết, trong khi trong khối CATCH, ngoại lệ sẽ bị bắt
BEGIN TRY INSERT INTO EmployeeDetails VALUES [1002,'Thomas','Scott','Accounts',3] END TRY BEGIN CATCH SELECT 'An error occurred performing this operation '+ ERROR_MESSAGE[] AS ErrorMessage SELECT ERROR_LINE[] AS ErrorLine, ERROR_NUMBER[] AS ErrorNumber, ERROR_PROCEDURE[] AS ErrorProcedure, ERROR_SEVERITY[] AS ErrorSeverity, ERROR_STATE[] AS ErrorState END CATCH GO
Nó đưa ra một ngoại lệ và hiển thị chi tiết lỗi
Như đã chỉ định trước đó, cột ErrorProcedure cung cấp giá trị NULL vì lỗi không được bắt gặp trong Quy trình được lưu trữ hoặc Trình kích hoạt
Xử lý lỗi
SELECT * FROM EmployeeDetails6/
SELECT * FROM EmployeeDetails7 có thể diễn ra bên trong hoặc bên ngoài thủ tục [hoặc cả hai]. Các ví dụ dưới đây minh họa cách xử lý lỗi trong cả hai trường hợp
Nếu bạn muốn thử nghiệm thêm, bạn có thể rẽ nhánh truy vấn trên Stack Exchange Data Explorer
[Điều này sử dụng một thủ tục được lưu trữ tạm thời. chúng tôi không thể tạo SP thông thường trên SEDE, nhưng chức năng thì giống nhau. ]
--our Stored Procedure
create procedure #myProc as --we can only create #temporary stored procedures on SEDE.
begin
BEGIN TRY
print 'This is our Stored Procedure.'
print 1/0 --