执行MSSQL存储过程导入XML时遇非法字符错误,但XML已验证有效
MSSQL 2008导入XML时的Msg 9420非法字符错误排查
我手里有一份XML文档,已经用好几个验证工具(包括在线验证器和Sublime Text的XML验证插件)检查过了,确认是完全有效的。但当我尝试把它导入MSSQL 2008,执行存储过程exec [dbo].[ImportNXML];的时候,却收到了这样的错误提示:
Msg 9420, Level 16, State 1, Line 2 XML parsing: line 17, character 35, illegal xml character。
可我反复核对过XML文档,里面并没有明显的非法字符,而且第17行对应位置的内容看起来也完全正常,这可把我难住了。下面是几个我总结的排查方向,说不定能帮到你:
- 检查不可见控制字符:大部分普通XML验证工具不会检测ASCII控制字符(比如
0x00到0x1F里,除了换行、回车、制表符之外的字符),但MSSQL的XML解析器对这类字符特别敏感。你可以用Notepad++这类编辑器开启「显示所有字符」的功能,仔细查看第17行附近有没有这类隐藏的特殊字符。 - 确认编码一致性:检查XML文档开头的编码声明(比如
<?xml version="1.0" encoding="UTF-8"?>)和文件实际存储的编码是否一致。如果文档实际是UTF-16编码,但声明成了UTF-8,MSSQL解析时可能会把字节错误解析成非法字符,从而触发报错。 - 排查存储过程的处理逻辑:仔细看看
ImportNXML存储过程里的代码,确认是不是在导入XML之前做了额外的字符串处理(比如拼接、替换操作),不小心引入了非法字符。另外,也要注意存储过程里存储XML的字段类型(比如NVARCHAR还是XML),有没有出现截断或者编码转换的问题。 - 逐段测试定位问题:把整个XML文档拆分成几个部分,逐段导入测试,这样能快速定位到底是哪一段内容触发了错误。有时候看起来正常的文本,可能包含了全角空格、零宽空格这类不易察觉的特殊字符。
内容的提问来源于stack exchange,提问作者16b7195abb140a3929bbc322d1c6f1
相关产品推荐
相关产品推荐

