如何通过Excel VBA实现一键运行预生成SQL脚本更新SQL Server数据
Excel一键执行J列SQL脚本VBA实现方案
完全可以通过VBA实现该需求,以下是具体可落地的实现步骤和代码:
前期准备
- 将Excel文件保存为
.xlsm启用宏的格式,普通.xlsx格式无法保存运行宏代码 - 确认操作的客户端已安装SQL Server ODBC驱动,常规安装过SSMS的设备都会默认自带该驱动,无SSMS的设备单独安装对应版本的SQL Server ODBC驱动即可
步骤1:添加执行按钮
打开Excel「开发工具」选项卡,点击「插入」-「表单控件」-「按钮(窗体控件)」,在表格空白区域绘制按钮,将按钮命名为一键更新SQL数据
步骤2:编写VBA代码
右键点击刚插入的按钮,选择「指定宏」,点击「新建」进入VBA编辑界面,将以下代码粘贴到编辑区域,按照实际业务情况替换代码中的SQL Server连接参数即可:
Sub 一键执行SQL更新() Dim conn As Object Dim strConn As String Dim lastRow As Long Dim i As Long Dim sqlStr As String ' 关闭屏幕刷新和弹窗提示提升运行效率 Application.ScreenUpdating = False Application.DisplayAlerts = False ' 初始化ADODB连接对象 Set conn = CreateObject("ADODB.Connection") ' -------------------------- ' 以下参数替换为实际SQL Server信息 ' -------------------------- Const SQL_SERVER As String = "你的服务器地址" ' 本地默认实例可填.或者(local),非默认实例要加端口号 Const SQL_DB As String = "你的数据库名称" ' 身份验证二选一,不需要的那行注释掉即可 ' 1、Windows身份验证(不需要账号密码,用当前Windows登录权限访问) strConn = "Provider=SQLOLEDB;Data Source=" & SQL_SERVER & ";Initial Catalog=" & SQL_DB & ";Integrated Security=SSPI;" ' 2、SQL Server身份验证(需要填账号密码) ' Const SQL_USER As String = "你的数据库账号" ' Const SQL_PWD As String = "你的数据库密码" ' strConn = "Provider=SQLOLEDB;Data Source=" & SQL_SERVER & ";Initial Catalog=" & SQL_DB & ";User ID=" & SQL_USER & ";Password=" & SQL_PWD & ";" On Error GoTo ErrHandler ' 打开数据库连接 conn.Open strConn ' 获取J列最后一行有效数据行号,假设表头在第1行,数据从第2行开始 lastRow = Cells(Rows.Count, "J").End(xlUp).Row ' 循环执行J列所有非空SQL语句 For i = 2 To lastRow sqlStr = Trim(Cells(i, "J").Value) If sqlStr <> "" Then conn.Execute sqlStr End If Next i MsgBox "数据更新完成,共执行" & lastRow - 1 & "条SQL语句", vbInformation, "执行成功" ' 释放连接资源 conn.Close Set conn = Nothing Application.ScreenUpdating = True Application.DisplayAlerts = True Exit Sub ErrHandler: MsgBox "执行失败,错误信息:" & Err.Description & vbCrLf & "出错位置:第" & i & "行" & vbCrLf & "对应SQL语句:" & sqlStr, vbCritical, "执行错误" ' 出错也释放资源避免连接泄漏 If conn.State = 1 Then conn.Close Set conn = Nothing Application.ScreenUpdating = True Application.DisplayAlerts = True End Sub
注意事项
- 执行前务必提前备份数据库,避免J列生成的SQL语句有语法逻辑错误导致数据损坏
- J列拼接的SQL建议先手动抽几条到SSMS验证执行正常,再用脚本批量执行
- 如果需要保证所有SQL要么全部成功要么全部失败,可以添加事务控制:在循环执行SQL前加
conn.BeginTrans,执行完成无报错加conn.CommitTrans,错误处理分支加conn.RollbackTrans即可
内容的提问来源于stack exchange,提问作者Gray Meiring
相关产品推荐
相关产品推荐

