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ệ

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 EmployeeDetails
        
6/
            SELECT * FROM EmployeeDetails
        
7 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                          --

Chủ Đề