|

本帖最后由 lzda90 于 2025-7-25 15:41 编辑
例子使用sql server 2008 版本
第一步需要创建好存储过程
在数据库 my_db 创建
[SQL] 纯文本查看 复制代码 USE [my_db]
GO
/****** Object: StoredProcedure [dbo].[usp_SafeUpdate] Script Date: 07/25/2025 15:13:53 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- ======================================================================
-- 存储过程: dbo.usp_SafeUpdate
-- 功能: 安全更新表中的记录,支持事务回滚和错误处理
-- 参数:
-- @paramA - 第一个输入参数
-- @paramB - 第二个输入参数
-- @ReturnCode - 输出参数,返回操作结果代码
-- @ReturnMessage - 输出参数,返回操作结果消息
-- 示例调用:
-- DECLARE @Code INT, @Msg NVARCHAR(255);
-- EXEC dbo.usp_SafeUpdate 'Hello', 'World', @Code OUTPUT, @Msg OUTPUT;
-- SELECT @Code AS 返回代码, @Msg AS 返回消息;
-- ======================================================================
CREATE PROCEDURE [dbo].[usp_SafeUpdate]
@paramA NVARCHAR(100), -- 输入参数A,不能为空
@paramB NVARCHAR(100), -- 输入参数B,不能为空
@ReturnCode INT OUTPUT, -- 输出参数:返回状态码(0=成功,非0=错误)
@ReturnMessage NVARCHAR(255) OUTPUT -- 输出参数:返回详细消息
AS
BEGIN
-- 设置执行环境
SET NOCOUNT ON; -- 不返回受影响行数,提高性能
SET XACT_ABORT OFF; -- 禁用自动事务回滚,手动控制事务
BEGIN TRY
-- 初始化输出参数
SET @ReturnCode = 0; -- 默认返回0(成功)
SET @ReturnMessage = '操作成功';
-- =============================================================
-- 步骤1: 参数验证
-- =============================================================
IF @paramA IS NULL OR @paramB IS NULL
BEGIN
SET @ReturnCode = 50001; -- 参数验证失败代码
SET @ReturnMessage = '错误: 参数 @paramA 和 @paramB 均不能为空。';
-- 抛出错误,跳转到CATCH块
RAISERROR(@ReturnMessage, 16, 1);
RETURN;
END;
-- =============================================================
-- 步骤2: 开始事务
-- =============================================================
BEGIN TRANSACTION;
-- =============================================================
-- 步骤3: 执行业务操作 - 更新表
-- 操作说明: 将id=1的记录的yingwenming字段更新为 @paramA 和 @paramB 的拼接值
-- =============================================================
UPDATE dbo.fanyicidian
SET yingwenming = @paramA + @paramB -- 拼接两个参数作为新值
WHERE id = 1; -- 限定更新id=1的记录
-- =============================================================
-- 步骤4: 检查操作结果
-- =============================================================
IF @@ROWCOUNT = 0
BEGIN
SET @ReturnCode = 50002; -- 未找到记录的错误代码
SET @ReturnMessage = '错误: 未找到匹配的记录进行更新。';
-- 抛出错误,跳转到CATCH块
RAISERROR(@ReturnMessage, 16, 1);
RETURN;
END;
-- =============================================================
-- 步骤5: 提交事务(所有操作成功)
-- =============================================================
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
-- =============================================================
-- 错误处理块
-- 功能: 捕获异常,回滚事务,并设置错误返回值
-- =============================================================
-- 声明变量存储错误信息
DECLARE @ErrorNumber INT = ERROR_NUMBER();
DECLARE @ErrorSeverity INT = ERROR_SEVERITY();
DECLARE @ErrorState INT = ERROR_STATE();
DECLARE @ErrorLine INT = ERROR_LINE();
DECLARE @ErrorProcedure NVARCHAR(200) = ISNULL(ERROR_PROCEDURE(), '-');
-- 如果事务未提交,则回滚
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
-- 设置错误返回值
SET @ReturnCode = @ErrorNumber;
SET @ReturnMessage =
'错误: 过程 ' + @ErrorProcedure +
' 第 ' + CAST(@ErrorLine AS NVARCHAR(10)) + ' 行: ' +
ERROR_MESSAGE();
-- 重新抛出错误,使用完整的RAISERROR语法(兼容SQL Server 2008)
RAISERROR(
@ReturnMessage, -- 错误消息
@ErrorSeverity, -- 错误严重性
@ErrorState -- 错误状态
);
END CATCH
END;
GO
调用过程语句命令字符串内容存到变量里去执行,这里使用常量,也可以自己定义变量,这里的数据库名称和过程名称需要根据实际填写:
DECLARE @RC int;
DECLARE @paramA nvarchar(100);
DECLARE @paramB nvarchar(100);
DECLARE @ReturnCode int;
DECLARE @ReturnMessage nvarchar(255);
EXECUTE @RC = [my_db].[dbo].[存储过程名称]
's2yyyys'
,'ff2yyy22f'
,@ReturnCode OUTPUT
,@ReturnMessage OUTPUT;SELECT @RC,@ReturnCode,@ReturnMessage;
|
|