如何忽略SQL Server表值中的换行?导出CSV单记录分行问题求助
解决SQL Server用sqlcmd导出CSV时含换行符的记录拆分问题
当使用sqlcmd导出包含换行符的字段时,CSV会将字段内的换行识别为新记录的开始,导致单条记录被拆分。以下是几种可行的解决办法:
方法1:替换字段中的换行符
在查询语句中直接将字段里的回车(CHAR(13))和换行(CHAR(10))替换为空格或其他符号,从根源上避免换行导致的拆分问题。
修改后的sqlcmd命令示例:
C:\>sqlcmd -S EC2AMAZ-5UNBD90 -Q "SELECT hmy, col1, col2, REPLACE(REPLACE(your_text_column, CHAR(10), ' '), CHAR(13), ' ') AS your_text_column /* 替换为实际列名,补充其他列 */ FROM dbo.PMDOCS WHERE hmy=95613900;" -s "," -o "C:\pmdocs_ms_v1.csv" -E -y0
其中your_text_column需要替换为实际包含换行符的列名,REPLACE函数会把所有回车和换行替换成空格,确保字段内容在同一行。
方法2:用双引号包裹所有字段
标准CSV格式中,被双引号包裹的字段即使包含换行符,也会被解析为单个字段。可以在查询中给每个字段添加双引号,同时处理字段内可能存在的双引号(将单个双引号替换为两个)。
对应的sqlcmd命令:
C:\>sqlcmd -S EC2AMAZ-5UNBD90 -Q "SELECT '"' + REPLACE(CAST(hmy AS VARCHAR(20)), '"', '""') + '"', '"' + REPLACE(CAST(col1 AS VARCHAR(20)), '"', '""') + '"', '"' + REPLACE(your_text_column, '"', '""') + '"' /* 补充其他列 */ FROM dbo.PMDOCS WHERE hmy=95613900;" -s "," -o "C:\pmdocs_ms_v1.csv" -E -y0 -W
- 用
CAST将非字符串类型的列转换为字符串,避免拼接错误 REPLACE(..., '"', '""')处理字段内的双引号,符合CSV格式规范-W参数用于去除输出中多余的空格,让CSV更整洁
方法3:使用bcp工具替代sqlcmd
bcp是SQL Server专门用于批量数据导入导出的工具,对特殊字符的处理更友好。如果需要频繁导出数据,推荐使用这个工具。
基本命令示例(配合字段包裹):
bcp "SELECT '"' + REPLACE(CAST(hmy AS VARCHAR(20)), '"', '""') + '"', '"' + REPLACE(your_text_column, '"', '""') + '"' /* 补充其他列 */ FROM dbo.PMDOCS WHERE hmy=95613900" queryout "C:\pmdocs_ms_v1.csv" -S EC2AMAZ-5UNBD90 -E -c -t "," -r "\n" -q
-c:使用字符模式导出-t ",":指定字段分隔符为逗号-r "\n":指定行终止符为换行-q:处理包含特殊字符或保留字的查询
内容的提问来源于stack exchange,提问作者Yang L
相关产品推荐
相关产品推荐

