SQL Server中使用BCP生成XML时如何实现节点换行输出?
SQL Server bcp导出XML实现节点单独换行的解决方案
原语句中FOR XML AUTO会将所有XML节点拼接成连续字符串,导致导出后节点没有换行。要实现每个节点单独占一行,可通过以下两种方法处理:
方法一:在查询中为每个节点追加换行符
修改查询逻辑,让每条记录生成独立的XML节点并添加换行符(CHAR(10)为换行,Windows环境可改用CHAR(13)+CHAR(10)实现回车换行):
EXEC xp_cmdshell 'bcp "SELECT CAST((SELECT * FROM DataCenter.Dbo.TblCity WHERE Id = t.Id FOR XML AUTO) AS NVARCHAR(MAX)) + CHAR(10) FROM DataCenter.Dbo.TblCity t" queryout "C:\Sample\Test.xml" -T -c -C 65001 -t,'
或者用更简洁的子查询方式:
EXEC xp_cmdshell 'bcp "SELECT (SELECT * FROM DataCenter.Dbo.TblCity AS c FOR XML AUTO, TYPE).value(''.'', ''NVARCHAR(MAX)'') + CHAR(10) FROM DataCenter.Dbo.TblCity" queryout "C:\Sample\Test.xml" -T -c -C 65001 -t,'
执行后,每个XML节点末尾会被添加换行符,导出的文件自然会呈现节点单独一行的效果。
方法二:利用XML格式化参数(会改变节点结构)
如果可以接受XML节点从属性形式改为子元素形式,可使用ELEMENTS和INDENT参数让XML自动格式化换行:
EXEC xp_cmdshell 'bcp "select * FROM DataCenter.Dbo.TblCity FOR XML AUTO, ELEMENTS, INDENT" queryout "C:\Sample\Test.xml" -T -w -C 65001'
注意:此方法会将原属性(如Id="1")转换为子元素<Id>1</Id>,若需保留原属性结构,优先使用方法一。
额外说明
- 确保目标目录
C:\Sample已存在,否则bcp会抛出路径不存在的错误。 -C 65001指定UTF-8编码,配合-c参数可保证导出的XML文件编码正确。
内容的提问来源于stack exchange,提问作者Reza Davoudian
相关产品推荐
相关产品推荐

