SQL Server 2019中SSMS与sqlcmd导出XML结果不一致问题
SQL Server 2019中sqlcmd导出XML损坏问题分析
核心原因排查
1. 输出编码不匹配
SSMS默认采用适配XML的编码(如UTF-16)处理输出,但Windows环境下的sqlcmd默认使用OEM编码(如GBK)。如果XML包含非ASCII字符,编码不一致会引发乱码,直接破坏XML结构的有效性。
2. 行宽限制导致自动换行
尽管用了-y0取消XML类型的长度限制,但sqlcmd默认有每行输出宽度限制(默认80字符),超过宽度会自动换行,将完整的XML节点拆分到多行,触发XML验证错误。
3. 冗余输出干扰XML结构
sqlcmd默认会输出表头、列分隔符等内容,这些额外字符插入到XML内容中,会直接破坏XML的格式完整性。
4. SQL Server 2019的XML序列化变更
升级后,SQL Server对XML的序列化逻辑有细微调整,比如特殊字符转义、命名空间的处理方式。SSMS内部会对XML结果做额外的格式化修正,但sqlcmd直接输出原始序列化结果,未处理这些边缘场景。
解决步骤
- 指定输出编码:添加
-f 65001参数强制sqlcmd使用UTF-8编码,确保和XML声明中的编码(如<?xml version="1.0" encoding="UTF-8"?>)一致。 - 取消行宽限制:结合
-w 65535(最大行宽)和-y0,避免XML节点被自动换行拆分。 - 移除冗余输出:添加
-h -1隐藏表头,-s ""取消列分隔符,确保输出只有纯XML内容。 - 禁用计数输出:在查询开头添加
SET NOCOUNT ON;,避免输出“影响行数”的额外文本。
修正后的sqlcmd命令示例
sqlcmd -S 你的服务器名 -d 你的数据库名 -U 用户名 -P 密码 -Q "SET NOCOUNT ON; SELECT 你的XML查询语句 FOR XML PATH('Root'), TYPE;" -y0 -w 65535 -h -1 -s "" -f 65001 -o "C:\导出路径\output.xml"
内容的提问来源于stack exchange,提问作者Tassos Voulgaris
相关产品推荐
相关产品推荐

