如何编写自动遍历唯一硬件名称执行sqlcmd导出CSV的批处理脚本
批处理自动遍历硬件名称导出CSV实现方案
实现思路
- 先通过
sqlcmd执行distinct查询拉取全量唯一硬件名称,输出到临时纯文本文件 - 用批处理
for /f循环读取临时文件的每一行硬件名称 - 逐个将硬件名称代入导出命令执行,输出对应CSV文件
- 所有任务执行完成后自动删除临时文件
完整脚本
@echo off setlocal enabledelayedexpansion :: ************************** 请修改以下连接配置 ************************** set "sql_server=你的数据库实例地址" set "sql_db=你的数据库名" set "sql_user=数据库用户名" set "sql_pwd=数据库密码" :: 日期格式处理为yyyyMMdd,避免文件名出现非法字符 set "date_str=%date:~0,4%%date:~5,2%%date:~8,2%" :: 临时文件存储路径 set "tmp_name_list=tmp_hardware_names.txt" :: *********************************************************************** :: 步骤1:拉取所有唯一硬件名称到临时文件 sqlcmd -S %sql_server% -d %sql_db% -U %sql_user% -P %sql_pwd% ^ -h -1 -W -Q "set nocount on; select distinct attribute from [table] where attribute is not null;" ^ > %tmp_name_list% :: 步骤2:循环遍历每个硬件名称执行导出 for /f "delims=" %%n in (%tmp_name_list%) do ( set "hardware_name=%%n" echo 正在导出:!hardware_name! :: 执行查询导出,此处可根据需求调整select字段、where条件,需要模糊匹配可把=替换为like sqlcmd -S %sql_server% -d %sql_db% -U %sql_user% -P %sql_pwd% ^ -W -Q "set nocount on; select somedata from [table] where attribute = '!hardware_name!';" ^ > "!hardware_name!_%date_str%.csv" ) :: 步骤3:清理临时文件 del %tmp_name_list% echo 所有硬件数据导出完成 pause endlocal
关键参数说明
sqlcmd参数-h -1:关闭查询结果表头输出,避免临时文件出现多余的标题行sqlcmd参数-W:自动去掉查询结果字段前后的空格,保证硬件名称纯净set nocount on:关闭SQL执行的行数统计输出,避免文件末尾出现多余的影响行数提示for /f参数"delims=":保留硬件名称中的空格,不会将带空格的名称切割为多个值- 开启
enabledelayedexpansion:保证循环内变量可以实时更新,避免批处理预编译导致的变量不生效问题
使用方式
仅需要修改脚本开头的数据库连接配置,保存后直接双击运行即可,不需要手动维护硬件名称列表,适配任意客户环境。
内容的提问来源于stack exchange,提问作者James K
相关产品推荐
相关产品推荐

