Làm cách nào để thử bắt trong SQL?
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ệ Show 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ẮTCấ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
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. )
Đây là kết quả của việc chạy nguyên trạng sql ở trên
¹ Việc bỏ ghi chú "dòng lỗi bổ sung" từ khối CATCH của Quy trình được lưu trữ sẽ tạo ra
² Việc bỏ ghi chú "dòng lỗi bổ sung" từ quy trình MAIN sẽ tạo ra
Về chủ đề thủ tục được lưu trữ và xử lý lỗi, có thể hữu ích (và gọn gàng hơn) khi sử dụng một thủ tục được lưu trữ, động, duy nhất để xử lý lỗi cho nhiều thủ tục hoặc phần mã khác Đây là một ví dụ ________số 8Đầu ra ví dụ. (Truy vấn này có thể được rẽ nhánh trên SEDE tại đây. )
Trong phạm vi của khối SELECT * FROM EmployeeDetails6/ SELECT * FROM EmployeeDetails7, các chức năng hệ thống sau đây có thể được sử dụng để lấy thông tin về lỗi khiến khối SELECT * FROM EmployeeDetails7 được thực thi
(Nguồn) Lưu ý rằng có hai loại lỗi SQL. Thiết bị đầu cuối và có thể bắt được. SELECT * FROM EmployeeDetails6/ SELECT * FROM EmployeeDetails7 sẽ [rõ ràng] chỉ bắt lỗi "Có thể bắt được". Đây là một trong số những cách để tìm hiểu thêm về các lỗi SQL của bạn, nhưng nó có lẽ là cách hữu ích nhất Làm cách nào để sử dụng thử bắt trong SQL?THỬ. Cấu trúc CATCH bắt tất cả các lỗi thực thi có mức độ nghiêm trọng cao hơn 10 mà không đóng kết nối cơ sở dữ liệu. Một khối TRY phải được theo sau ngay bởi một khối CATCH được liên kết . Bao gồm bất kỳ câu lệnh nào khác giữa câu lệnh END TRY và BEGIN CATCH sẽ tạo ra lỗi cú pháp.
Chúng ta có thể sử dụng try catch trong các hàm SQL không?THỬ. Các khối CATCH có thể được sử dụng với các giao dịch . Chúng tôi kiểm tra số lượng giao dịch đang mở bằng cách sử dụng hàm @@TRANCOUNT trong Sql Server. Hàm XACT_STATE trong TRY.
Tại sao chúng tôi sử dụng thử bắt trong SQL?Câu lệnh try cho phép bạn xác định một khối mã sẽ được kiểm tra lỗi trong khi nó đang được thực thi. Câu lệnh catch cho phép bạn xác định một khối mã sẽ được thực thi, nếu xảy ra lỗi trong khối thử .
Làm cách nào để bắt ngoại lệ trong SQL Server?Để xử lý ngoại lệ trong Sql Server, chúng ta phải THỬ. CATCH khối . Chúng tôi đặt các câu lệnh T-SQL trong khối TRY và để xử lý ngoại lệ, chúng tôi viết mã trong khối CATCH. Nếu có lỗi về mã trong khối TRY thì điều khiển sẽ tự động nhảy đến khối CATCH tương ứng. |