You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Excel中通过VBA执行SQL Server存储过程并传入变量参数

VBA调用带参数SQL Server存储过程解决方案

前置要求:请先在VBA编辑器的「工具-引用」中勾选Microsoft ActiveX Data Objects 6.1 Library(版本号根据你的环境选最高的即可),避免运行报错。

完整修正代码

Sub reverse_posted()
    Dim con As ADODB.Connection
    Dim cmd As ADODB.Command
    Dim documentNo As Long
    
    ' 输入校验,避免无效输入报错
    On Error Resume Next
    documentNo = InputBox("请输入需要重新过账的发票号")
    If Err.Number <> 0 Or documentNo <= 0 Then
        MsgBox "输入无效,请输入正确的数字发票号", vbExclamation
        Exit Sub
    End If
    On Error GoTo 0
    
    ' 初始化数据库连接
    Set con = New ADODB.Connection
    con.Open "Provider=SQLOLEDB;Data Source=ashcourt_app1;Initial Catalog=ASHCOURT_Weighsoft5;Integrated Security=SSPI;Trusted_Connection=Yes;"
    
    ' 配置存储过程执行命令
    Set cmd = New ADODB.Command
    With cmd
        .ActiveConnection = con
        .CommandType = adCmdStoredProc
        .CommandText = "ashcourt_balfour_reverse_posting" ' 仅填写存储过程名称即可,不要拼接参数
        ' 创建并传入对应@document_no的参数
        .Parameters.Append .CreateParameter("@document_no", adInteger, adParamInput, , documentNo)
        ' 执行存储过程,UPDATE操作无返回结果集,不需要用Recordset接收
        .Execute
    End With
    
    ' 释放资源
    Set cmd = Nothing
    con.Close
    Set con = Nothing
    MsgBox "操作完成", vbInformation
End Sub

核心改动说明

  • 原代码错误将输入参数直接拼接到存储过程名称后,正确做法是通过CreateParameter方法单独创建参数对象,追加到命令的参数集合中,既符合规范也可以避免SQL注入风险
  • 你的存储过程是UPDATE更新操作,没有查询结果返回,因此不需要声明使用Recordset对象,减少不必要的资源占用
  • 新增输入校验逻辑,避免用户输入非数字、点击取消时出现运行报错

内容的提问来源于stack exchange,提问作者Darren Wardill

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 11:24:03