首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 預存程序錯誤處理模式:@@ERROR、@@ROWCOUNT 與交易控制

     編輯:關於SqlServer

在 SQL Server 2000/2005 (無 TRY...CATCH) 環境下,預存程序錯誤處理依賴 @@ERROR 與 @@ROWCOUNT 系統函數搭配交易控制。

經典範例


CREATE PROCEDURE Proc_InsertTemp
    @number VARCHAR(3000),
    @name VARCHAR(2100),
    @output VARCHAR(100) OUTPUT
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @outputerr VARCHAR(3000);

    BEGIN TRANSACTION operTran1  -- 明確開啟交易

    INSERT INTO dbo.Table_1 (number, value) VALUES (@number, @name);

    -- 緊接檢查錯誤與影響列數
    IF @@ERROR <> 0 OR @@ROWCOUNT = 0
    BEGIN
        SET @output = '-1';          -- 回傳錯誤代碼
        ROLLBACK TRANSACTION operTran1;
        RETURN;
    END
    ELSE
    BEGIN
        COMMIT TRANSACTION operTran1;
    END
END
GO

資料表結構


CREATE TABLE dbo.Table_1 (
    number INT NULL,
    value NVARCHAR(50) COLLATE Chinese_PRC_CI_AS NULL
);

關鍵點解析

  1. @@ERROR:上一條陳述式的錯誤號 (0 表示成功)。必須緊接在目標陳述式之後檢查,任何中間陳述式 (如 SET, IF) 都會重置為 0。
  2. @@ROWCOUNT:上一條陳述式影響的列數。INSERT 若為 0 表示未寫入資料 (可能觸發器攔截或條件不符)。
  3. 交易命名:BEGIN TRANSACTION operTran1 便於巢狀交易管理與除錯。
  4. 輸出參數:@output VARCHAR(100) OUTPUT 回傳執行狀態給呼叫端。
  5. SET NOCOUNT ON:關閉「影響列數」訊息,減少網路流量與客戶端干擾。

SQL Server 2005+ 建議改用 TRY...CATCH


BEGIN TRY
    BEGIN TRANSACTION;
    INSERT INTO dbo.Table_1 (number, value) VALUES (@number, @name);
    COMMIT TRANSACTION;
    SET @output = '0';
END TRY
BEGIN CATCH
    IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION;
    SET @output = ERROR_MESSAGE();  -- 或自訂錯誤代碼
    -- 可記錄 ERROR_NUMBER(), ERROR_SEVERITY(), ERROR_LINE() 等
END CATCH

TRY...CATCH 結構更清晰、支援巢狀、可捕獲編譯/執行階段錯誤,為現代最佳實務。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved