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

Ghi ngăn xếp cuộc gọi SQL Server khi báo cáo lỗi

Được rồi, tôi sẽ thêm lại cách xử lý lỗi của chúng tôi trong :-)

Các hàm ERROR _% () được hiển thị trong phạm vi của khối CATCH. Điều này có nghĩa là bạn có thể sử dụng chúng trong một lệnh gọi hàm hoặc lệnh được lưu trữ trong mỗi khối CATCH

Và với các procs được lưu trữ lồng nhau, sẽ rất hữu ích khi biết nguyên nhân gây ra lỗi và điều gì ghi lại lỗi

...
END TRY
BEGIN CATCH
    IF XACT_STATE() <> 0 AND @starttrancount = 0 
        ROLLBACK TRANSACTION
    EXEC dbo.MyExceptionHandler @@PROCID, @errmsg OUTPUT;
    RAISERROR (@errmsg, 16, 1);
END CATCH

---with this handler (cut down version of ours)
CREATE PROCEDURE dbo.MyExceptionHandler
    @CallerProcID int,
    @ErrorMessage varchar(2000) OUTPUT
WITH EXECUTE AS OWNER --may be needed to get around metadata visibility issues of OBJECT_NAME
AS
SET NOCOUNT, XACT_ABORT ON;

BEGIN TRY
    SET @ErrorMessage = --cutdown
            CASE
                WHEN @errproc = @callerproc THEN        --Caller = error generator
                        --build up stuff

                ELSE    --Just append stuff             --Nested error stack
            END;

    IF @@TRANCOUNT = 0
        INSERT dbo.Exception (Who, TheError, WhatBy, LoggedBy)
        VALUES (ORIGINAL_LOGIN()), RTRIM(ERROR_MESSAGE()), ERROR_PROCEDURE(), OBJECT_NAME(@CallerProcID));
END TRY
BEGIN CATCH
   --and do what exactly?
END CATCH
GO

Dù sao đây cũng là ý tưởng cơ bản:mỗi khối CATCH rất đơn giản, công việc tiếp tục diễn ra trong trình xử lý lỗi. Ví dụ:chắp thêm ERROR_NUMBER() nếu bạn muốn



  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ập nhật một trường của bảng hiện có với Logic Tăng dần Tự động

  2. Trả về thông tin cột cho một thủ tục được lưu trữ trong SQL Server:sp_sproc_columns

  3. Cách tạo Ràng buộc duy nhất tổng hợp trong SQL Server 2005

  4. Nhiều câu lệnh 'in' trong mệnh đề where cần khớp với nhau

  5. SSRS lựa chọn kết quả dựa trên danh sách được phân tách bằng dấu phẩy