Windows批量执行Sql文件
使用场景:按文件名字正序,批量执行某文件夹下的所有sql文件,并输出日志
适合人群:实施工程师
一、使用篇
1、原材料:
1.1、ExecSql.bat(执行脚本)(文件编码:ANSI,这个编码与下面提到的utf8和gb2312都不一样,用记事本编辑默认就是这个编码,所以不一定要下notepad++)
@ECHO OFF SET dbhost=127.0.0.1 SET dbuser=sa SET dbpasswd=sa SET dbName=Application REM 以下内容不建议修改 REM 执行脚本的路径,此处为当前路径 SET sqlpath=%~dp0 REM 日志文件名 SET temp=%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%.log SET logFileName=%sqlpath%%temp: =0% ::执行sql脚本 echo 开始执行sql脚本,所有日志记录于%logFileName% for /r %%i in (*.sql) do ( echo %%i被执行 & echo ----- %%i log start ----- >> %logFileName% & sqlcmd -S %dbhost% -U %dbuser% -P %dbpasswd% -d %dbName% -i %%i -k -b -m 10 >> %logFileName% & echo ----- %%i log end ----- >> %logFileName% & @echo. >> %logFileName%) ECHO 完成! PAUSE
1.2、ShowOrder.bat(查看什么脚本会被执行,按什么顺序执行)(文件编码:ANSI)
@ECHO OFF for /r %%i in (*.sql) do ( echo %%i ) ECHO 完成! PAUSE
2、文件目录结构,如图,假设我需要执行此文件夹下所有的sql文件,将ExecSql.bat复制到目标根目录下
3、【可选做】如果对sql文件的执行顺序有要求的,需要对文件进行重命名,如上图所示,执行顺序为文件名字正序,建议使用“01.”这种作为文件名前缀
将ShowOrder.bat复制到目标根目录下,双击运行,查看执行顺序是否符合预期
4、【重要】一般情况下.sql文件的编码都是utf8,如果.sql文件内容中,使用了中文(注释不算),则需要修改文件编码是GB2312,否则会执行错误的sql语句。
比如01.XXX.sql的编码是utf8的,但插入数据库的数据却是乱码
4.1、修改编码的方法为:使用Notepad打开.sql文件,ctrl+A(全选),ctrl+C(复制),点击Notepad“编码”->“编码字符集”->“中文”->“GB2312”,应该会出现一个“无法恢复警告”,点“是”,ctrl+A(全选),ctrl+V(粘贴),最后保存
4.2、使用工具(EncodingConverter)批量修改:
转化完成后会再执行会得到正确的中文
5、用Notepad++打开bat文件,修改ExecSql.bat中的数据库连接相关信息,只改跟连接数据库相关的4个变量即可,其他不需要修改
6、保存后上一步的修改后,双击bat文件,会有如图所示的输出
7、检查每一个.log文件,没有消息就是好消息,一个执行正确脚本的.log文件一般长这样
有错误也会反馈出来,如脚本再执行一次就会报错
特别提醒:此bat文件会检查当前文件夹下所有的.sql文件并执行,再次执行bat时需要删掉一些不用再次执行的.sql文件
二、原理篇
sqlcmd和osql两种命令都可以执行sql文件,两者参数配置项几乎完全一样,这里选用sqlcmd是出于这个的日志输出比较整洁,且微软打算在未来SqlServer中删除osql(不再支持)。两种命令都可以在cmd中使用XXX/?来查询帮助
sqlcmd的官方文档:https://docs.microsoft.com/zh-cn/sql/tools/sqlcmd-utility?view=sql-server-ver15
osql的官方文档:https://docs.microsoft.com/zh-cn/sql/tools/osql-utility?view=sql-server-ver15
原文地址:https://www.cnblogs.com/ogurayui/p/15045519.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 工具包 | 使用Python绘制Sci学术期刊配图
- 深入剖析AQS和CAS,看了都说好
- 用Python爬取自主品牌汽车,看看国产汽车究竟长什么样?(下)
- 读者问:小林怎么学操作系统和计算机网络呀?
- 用Python搭建一个简单的代理池
- 用Python模拟登陆GitHub并获取信息
- APUE学习手札 编写一个与3.12节中dup2功能相同的函数,要求不调用fcntl函数,并且要有正确的出错处理
- Python教程 | 最标准的地图调用方式(国家测绘局提供数据)
- Python数据可视化:Python大佬有哪些?
- 新手一看就懂的线程池
- 「面试」破(B)站之旅
- 想过为你的应用加上skywalking(链路监控)吗?
- 结合注意力机制的UNet降水短临预报框架
- 用Python全自动下载抖音视频!
- 如何实现一个高效的启发式算法?