You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 17:54:49