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
        

Làm cách nào để thử bắt trong SQL?

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'            
        

Làm cách nào để thử bắt trong SQL?

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

Làm cách nào để thử bắt trong SQL?

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                          --<-- generate a "Divide By Zero" error.
      print 'We are not going to make it to this line.'
    END TRY
    
    BEGIN CATCH
      print 'This is the CATCH block within our Stored Procedure:'
          + ' Error Line #'+convert(varchar,ERROR_LINE())
          + ' of procedure '+isnull(ERROR_PROCEDURE(),'(Main)')
      --print 1/0                        --<-- generate another "Divide By Zero" error.
        -- uncomment the line above to cause error within the CATCH ¹ 
    END CATCH
  end
go

--our MAIN code block:
BEGIN TRY
  print 'This is our MAIN Procedure.'
  execute #myProc  --execute the Stored Procedure
      --print 1/0                        --<-- generate another "Divide By Zero" error.
        -- uncomment the line above to cause error within the MAIN Procedure ²
  print 'Now our MAIN sql code block continues.'
END TRY

BEGIN CATCH
  print 'This is the CATCH block for our MAIN sql code block:'
          + ' Error Line #'+convert(varchar,ERROR_LINE())
          + ' of procedure '+isnull(ERROR_PROCEDURE(),'(Main)')
END CATCH

Đây là kết quả của việc chạy nguyên trạng sql ở trên

This is our MAIN Procedure.
This is our Stored Procedure.
This is the CATCH block within our Stored Procedure: Error Line #5 of procedure #myProc
Now our MAIN sql code block continues.

¹ 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

This is our MAIN procedure.
This is our Stored Procedure.
This is the CATCH block within our Stored Procedure: Error Line #5 of procedure #myProc
This is the CATCH block for our MAIN sql code block: Error Line #13 of procedure #myProc

² Việc bỏ ghi chú "dòng lỗi bổ sung" từ quy trình MAIN sẽ tạo ra

This is our MAIN Procedure.
This is our Stored Pprocedure.
This is the CATCH block within our Stored Procedure: Error Line #5 of procedure #myProc
This is the CATCH block for our MAIN sql code block: Error Line #4 of procedure (Main)

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. )

This is our MAIN procedure.
This is our stored procedure.
 Error #8134: Divide by zero error encountered.
 occurred on line #5 of procedure #myProc
*The error halted the procedure, but our MAIN code can continue.
 Error #8134: Divide by zero error encountered.
 occurred on line #5 of procedure (Main)
*Execution cannot continue after an error in the MAIN procedure.

Trong phạm vi của khối

            SELECT * FROM EmployeeDetails
        
6/
            SELECT * FROM EmployeeDetails
        
7, 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 EmployeeDetails
        
7 được thực thi

  • This is our MAIN Procedure.
    This is our Stored Procedure.
    This is the CATCH block within our Stored Procedure: Error Line #5 of procedure #myProc
    Now our MAIN sql code block continues.
    
    1 trả về số lỗi
  • This is our MAIN Procedure.
    This is our Stored Procedure.
    This is the CATCH block within our Stored Procedure: Error Line #5 of procedure #myProc
    Now our MAIN sql code block continues.
    
    2 trả về mức độ nghiêm trọng
  • This is our MAIN Procedure.
    This is our Stored Procedure.
    This is the CATCH block within our Stored Procedure: Error Line #5 of procedure #myProc
    Now our MAIN sql code block continues.
    
    3 trả về số trạng thái lỗi
  • This is our MAIN Procedure.
    This is our Stored Procedure.
    This is the CATCH block within our Stored Procedure: Error Line #5 of procedure #myProc
    Now our MAIN sql code block continues.
    
    4 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
  • This is our MAIN Procedure.
    This is our Stored Procedure.
    This is the CATCH block within our Stored Procedure: Error Line #5 of procedure #myProc
    Now our MAIN sql code block continues.
    
    5 trả về số dòng bên trong quy trình gây ra lỗi
  • This is our MAIN Procedure.
    This is our Stored Procedure.
    This is the CATCH block within our Stored Procedure: Error Line #5 of procedure #myProc
    Now our MAIN sql code block continues.
    
    6 trả về toàn bộ văn bản của thông báo lỗi. Văn bản bao gồm các giá trị được cung cấp cho bất kỳ tham số có thể thay thế nào, chẳng hạn như độ dài, tên đối tượng hoặc thời gian

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