编写BAT脚本导出昨日SQL数据至CSV时遇错误求排查
问题分析与修复方案
核心问题
你的BAT脚本报错有两个关键原因:
- 特殊字符
<被批处理错误解析:在BAT脚本中,<是输入重定向的特殊符号,SQL语句里的[Response_Date] < cast(current_timestamp as date)未对<做转义处理,导致BAT将其识别为重定向命令,拆分了原本的sqlcmd指令,进而触发“找不到文件”的错误。 - SQL语句换行引发解析异常:双引号包裹的SQL语句换行后,批处理解析器误判了命令结构,进一步加剧了指令拆分的问题。
修复后的脚本
以下是两种可行的修复方式:
方式1:转义特殊字符并调整格式
将<转义为^<,确保SQL语句被完整包裹:
SQLCMD -S cadarchive -d Reporting_System -E -Q "Select ID,Master_Incident_Number,Response_Date,Problem,MethodOfCallRcvd,EMD_Used,Determinant,ProQa_CaseNumber,ProQa_CaseNumber_Fire,ProQa_CaseNumber_Police,MachineName,CallTaking_Performed_By FROM [Response_Master_Incident] where [Response_Date]>=cast(dateadd(day,-1, CURRENT_TIMESTAMP) as date) and [Response_Date] ^< cast(current_timestamp as date) and EMD_Used=1" -s "," -o "C:\ProQASQL\Exported_Table.csv" @pause
方式2:用变量存储SQL语句(更易维护)
先将SQL语句存入变量,再传递给sqlcmd,降低解析出错概率:
SET SQL_QUERY=Select ID,Master_Incident_Number,Response_Date,Problem,MethodOfCallRcvd,EMD_Used,Determinant,ProQa_CaseNumber,ProQa_CaseNumber_Fire,ProQa_CaseNumber_Police,MachineName,CallTaking_Performed_By FROM [Response_Master_Incident] where [Response_Date]>=cast(dateadd(day,-1, CURRENT_TIMESTAMP) as date) and [Response_Date] ^< cast(current_timestamp as date) and EMD_Used=1 SQLCMD -S cadarchive -d Reporting_System -E -Q "%SQL_QUERY%" -s "," -o "C:\ProQASQL\Exported_Table.csv" @pause
补充说明
- 批处理中需转义的特殊字符包括
>、<、&,转义符为^,放置在特殊字符前即可生效。 - 较长的SQL语句建议用变量存储,既便于后续修改,也能减少命令行解析错误的出现概率。
内容的提问来源于stack exchange,提问作者WGraulich
相关产品推荐
相关产品推荐

