SQL代理作业中sqlcmd参数使用:导出双引号包裹数据问题
sqlcmd导出带双引号CSV的实现方案及参数清单
sqlcmd没有内置自动给字段值包裹双引号的参数,你当前用的-s ","仅能指定逗号为列分隔符,无法自动生成带双引号包裹的标准CSV格式,可通过以下两种方案实现需求:
方案1:直接在SQL查询中拼接双引号
这是改造成本最低的方式,无需调整现有sqlcmd调用逻辑,只需要修改查询语句,给每个要导出的字段前后拼接双引号即可,注意非字符串类型字段需要先转为字符串类型再拼接,示例:
原查询写法:
SELECT s.id, s.name, s.create_time FROM sys.tables s ORDER BY s.name
修改后写法:
SELECT '"' + CAST(s.id AS VARCHAR(MAX)) + '"' AS id, '"' + s.name + '"' AS name, '"' + CONVERT(VARCHAR, s.create_time, 120) + '"' AS create_time FROM sys.tables s ORDER BY s.name
配合你现有的-h -1 -s ","参数,导出的文件就是字段带双引号包裹的逗号分隔格式,完全符合要求。
方案2:导出后通过PowerShell二次加工
如果不想改动原有SQL语句,可以先按现有逻辑导出无引号的逗号分隔临时文件,再通过PowerShell逐行处理给每个字段包裹双引号,示例代码片段:
# 原有sqlcmd导出逻辑,先输出到临时文件 sqlcmd -S "你的数据库实例" -d "目标库名" -E -Q "SELECT * FROM 你的表 ORDER BY s.name" -s "," -o $tempFile -h -1 -W # 逐行处理给字段加双引号,输出到最终文件 Get-Content $tempFile | ForEach-Object { $fields = $_ -split ',' '"' + ($fields -join '","') + '"' } | Set-Content $instfile -Encoding UTF8
sqlcmd 常用参数完整清单
按使用场景分类:
连接认证类
-S <服务器[\实例名]>:指定要连接的SQL Server实例,本地默认实例可直接填localhost-d <数据库名>:连接成功后默认切换到的数据库-U <登录账号>:SQL Server身份认证的用户名-P <登录密码>:对应账号的密码-E:使用当前Windows账号做可信连接,和-U/-P参数互斥-l <秒数>:登录超时时间,默认8秒,设为0表示无超时限制
查询输入类
-Q "<SQL语句>":执行指定的SQL语句,执行完毕后自动退出sqlcmd,适合自动化脚本调用-q "<SQL语句>":启动时执行指定SQL语句,执行完保留交互会话不退出-i <SQL脚本路径>:执行指定路径下的.sql脚本,多个脚本用逗号分隔
输出格式类
-o <输出文件路径>:将查询结果写入指定文件,不输出到控制台-s <分隔符>:设置列与列之间的分隔符,当前用的,就是逗号分隔,默认分隔符为空格-h <行数>:指定每隔多少行重复输出一次表头,-h -1表示完全隐藏表头,不输出列名行-W:自动去除每个字段值首尾的多余填充空格,导出CSV时建议加上,减少无效字符-w <字符数>:设置单行输出的最大宽度,超出会自动换行,导出宽表时建议设为1024或更大-y <长度>:设置varchar(max)、nvarchar(max)、xml等大字段类型的最大返回长度,默认256,设为0表示返回完整内容-Y <长度>:设置char、nchar等固定长度字符类型的最大返回长度-r <0|1>:设为1时错误信息直接输出到控制台,不会混入结果文件-f <编码ID>:设置输出文件的字符编码,65001对应UTF-8,936对应GBK
其他实用参数
-m <错误级别>:仅输出大于等于指定级别的错误信息,低级提示信息会被屏蔽-b:SQL执行出错时返回系统错误码,方便在脚本中判断执行是否成功-a <数据包大小>:设置和服务器通信的数据包大小,范围512-32767,默认4096,大批量导出时可调高提升效率
注意:sqlcmd参数严格区分大小写,比如
-s是设置列分隔符,-S是指定数据库实例,书写时不要混淆。
内容的提问来源于stack exchange,提问作者timcstl
相关产品推荐
相关产品推荐

