Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Trả lại thông báo lỗi từ quy trình đã lưu trữ

Bạn có thể muốn bắt đầu sử dụng THỬ..CATCH chặn trong thủ tục của bạn

Vì vậy, thủ tục của bạn có thể được viết lại thành:

CREATE PROCEDURE spTest_Delete @ID INT
AS
BEGIN
    SET NOCOUNT ON;
    BEGIN TRY
        BEGIN TRANSACTION
            DELETE
            FROM Test
            WHERE ID = @ID;
        COMMIT TRANSACTION
    END TRY
    BEGIN CATCH
        IF @@TRANCOUNT > 0
            ROLLBACK TRANSACTION
        SELECT ERROR_NUMBER(), ERROR_MESSAGE();
    END CATCH
END

Ngoài ra, xin lưu ý rằng bạn đang chạy dưới dạng câu lệnh xóa duy nhất. Nó có nghĩa là nó không cần phải được gói gọn trong một giao dịch. Điều này câu hỏi giải thích tại sao.

Mã của bạn trở thành thế này:

CREATE PROCEDURE spTest_Delete @ID INT
AS
BEGIN
    SET NOCOUNT ON;
    BEGIN TRY
        DELETE
        FROM Test
        WHERE ID = @ID;
    END TRY
    BEGIN CATCH
        SELECT ERROR_NUMBER(), ERROR_MESSAGE();
    END CATCH
END

Bây giờ tại sao @errMessage của bạn luôn luôn là NULL? Bởi vì ERROR_MESSAGE() CHỈ có hiệu lực TRONG KHỐI CÁT. Nội dung đó được viết trong tài liệu :

Sử dụng TRY..CATCH trong Transact-SQL nói với điều này:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách lấy giá trị gốc chung, thấp nhất cho 2 hàng trong bảng đệ quy (SQL)

  2. Xác định hành động xóa tất cả các hàng trong bảng

  3. Cần tính toán theo thời gian hoặc con số ngày được làm tròn trong máy chủ sql

  4. Sắp xếp đúng các số có dấu chấm được lưu trữ dưới dạng ký tự trong SQL Server

  5. Làm thế nào để sử dụng Biểu thức chính quy trong máy chủ sql?