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

SQL Server 2014 SSIS导出XML报错:名称不能以'.'字符开头

解决SQL Server+SSIS生成XML导入第三方应用的编码问题

问题回顾

你用SQL Server 2014结合SSIS,通过OLE DB源执行一段生成XML的SQL,把结果输出到配置为XML格式的平面文件目标,但导入第三方应用时收到错误:“名称不能以'.'字符开头,十六进制值0x00。第1行,位置40”,用MS Word打开也提示“无法切换编码”,怀疑是UTF-8编码和nvarchar(max)的组合导致的——你的猜测方向完全正确,这俩确实是问题的核心。

问题根源

  1. nvarchar(max)的编码特性:nvarchar是SQL Server里的UTF-16双字节编码类型,当你把XML类型转成nvarchar(max)再手动拼接UTF-8的XML声明时,相当于把UTF-16的内容硬套上UTF-8的标签,输出到平面文件时,双字节字符的高字节(很多时候是0x00空字符)会被保留下来,而XML规范里明确不允许出现0x00这类控制字符,这就是第三方应用报错的直接原因。
  2. 手动拼接XML声明的隐患:你手动添加的<?xml version="1.0" encoding="UTF-8"?>和实际输出的内容编码不匹配,Word检测到编码声明和文件真实编码不一致,就会弹出“无法切换编码”的提示。

解决方案

1. 简化SQL语句,直接返回XML类型

不要手动拼接声明,也不要转成nvarchar(max),让SQL Server直接生成原生XML结果:

WITH XMLNAMESPACES('myNameSpace' as ns)
SELECT field1 
FROM table1 
FOR XML PATH('Testing'), TYPE, ROOT('TestingLoader'), ELEMENTS XSINIL

这样返回的是原生XML类型,保留了正确的编码信息,从根源上避免了双字节转字符串引入的空字符问题。

2. 正确配置SSIS平面文件目标的编码

在SSIS的平面文件连接管理器中:

  • 选择编码为UTF-8
  • 确保文件格式设置符合你的需求(比如带分隔符或固定宽度),核心是编码一定要和XML内容匹配
  • 如果需要XML声明,更稳妥的方式是让SSIS处理编码转换,而非手动拼接,避免编码不匹配的问题

3. 若需自定义声明,改用varchar(max)转换

如果一定要保留自定义的XML声明,不要用nvarchar(max)拼接,改用varchar(max)确保编码转换正确:

DECLARE @XMLOutput XML
WITH XMLNAMESPACES('myNameSpace' as ns)
SELECT @XMLOutput = (
    SELECT field1 
    FROM table1 
    FOR XML PATH('Testing'), TYPE, ROOT('TestingLoader'), ELEMENTS XSINIL
)
SELECT '<?xml version="1.0" encoding="UTF-8"?>' + CONVERT(varchar(max), @XMLOutput) AS XMLOutput

不过这种方式还是不如直接返回XML类型让SSIS处理编码来得可靠。

验证方法

修改后生成的XML文件,可以用Notepad++这类文本编辑器打开,查看编码是否为UTF-8,同时搜索\x00确认不存在空字符,无误后再导入第三方应用即可。

内容的提问来源于stack exchange,提问作者Michael

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:29:02