精易论坛

标题: 易语言 执行SQLSERVER 存储过程 带参数简单例子 [打印本页]

作者: lzda90    时间: 4 天前
标题: 易语言 执行SQLSERVER 存储过程 带参数简单例子
本帖最后由 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;



  
窗口程序集名保 留  保 留备 注
窗口程序集_启动窗口   
子程序名返回值类型公开备 注
__启动窗口_创建完毕  
变量名类 型静态数组备 注
局部_存储过程文本型 
i整数型 
局部_记录数整数型 
i2整数型 
局部_字段文本文本型 
局部_结果文本型 
如果 (数据库连接1.连接SQLServer (“127.0.0.1”, “my_db”, “sa”, “密码”))
调试输出 (“数据库链接成功”)
如果 (记录集1.置连接 (数据库连接1))
调试输出 (“记录集1.置连接 成功”)

调试输出 (“记录集1.置连接 失败”)
结束 ()


调试输出 (“数据库链接失败”)
结束 ()

如果 (记录集1.打开 ( #常量1, 1, ))
局部_记录数 = 记录集1.记录数量
如果 (局部_记录数 = -1)
调试输出 (“没有记录”)



记录集1.到首记录 ()
计次循环首 (局部_记录数, i)
局部_结果 = “”
计次循环首 (记录集1.字段数量, i2)
记录集1.读文本 (i2 - 1, 局部_字段文本)
局部_结果 = 局部_结果 + 局部_字段文本 + “ ”
计次循环尾 ()
调试输出 (i, 局部_结果)
如果真 (局部_记录数 > 1)
记录集1.到下一条 ()

计次循环尾 ()

调试输出 (“局部_存储过程 成功”)
调试输出 (“局部_存储过程 成功”)


i支持库列表   支持库注释   
eDB数据库操作支持库
spec特殊功能支持库



作者: 曜辉    时间: 4 天前
很少用储存过程,学习了!
作者: 小书    时间: 4 天前
楼主是大佬,牛13
作者: lzda90    时间: 3 天前
之前网上搜了好久没有找到例子,后来自己研究测试了好多才可以,有些项目还是很需要数据库过程的,但是网上居然很少例子,所以就发布出来了




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4