在 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
);
SET, IF) 都會重置為 0。INSERT 若為 0 表示未寫入資料 (可能觸發器攔截或條件不符)。BEGIN TRANSACTION operTran1 便於巢狀交易管理與除錯。@output VARCHAR(100) OUTPUT 回傳執行狀態給呼叫端。
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 結構更清晰、支援巢狀、可捕獲編譯/執行階段錯誤,為現代最佳實務。