XML解析 - 非法XML字符(执行存储过程时,运行过程查询不会导致错误)

时间:2018-04-04 00:13:57

标签: sql-server xml sql-server-2008 tsql

我有一个有效的XML文档(已经使用多个XML验证器确认了这一点,包括在线验证器和Sublime Text XML验证器插件)。

尝试使用名为ImportNXML的存储过程将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行中没有非法字符,字符35只是数字1.我尝试修改此行,用字母替换整行,用一个替换整行数字,在此行之前用文字/数字填充文档中的其他行,但我收到完全相同的错误抱怨完全相同的位置。

如果我打开ImportNXML存储过程并运行查询内容,我根本不会收到任何错误。

使用' exec'执行时,可能导致存储过程失败的原因是什么?命令但是当过程内容作为扩展查询执行时成功吗?

前17行的模拟数据如下:

<?xml version="1.0" ?>
<ClientData>
<Policy><policyName>The Policy Name</policyName>
<Preferences><ServerPreferences><preference><name>Sessions</name>
<value>3</value>
</preference>
<preference><name>Detection</name>
<value>yes</value>
</preference>
<preference><name>Mac</name>
<value>no</value>
</preference>
<preference><name>Plugin</name>
<value>108478;84316;32809;93635;36080;87560;61117;35292;75260;83156;61271;103773;12899;82513;56376;77796;85655;60338;56763;79951;</value>
</preference>
<preference><name>TARGET</name>
<value>123.123.123.123,234.234.234.234</value>

导入XML的存储过程的部分如下:

EXEC(' INSERT INTO XmlImportTest(xmlFileName, xml_data) SELECT ''' + @importPath + ''', xmlData FROM ( SELECT * FROM OPENROWSET (BULK ''' + @importPath + ''' , SINGLE_BLOB) AS XMLDATA ) AS FileImport (XMLDATA) ') 

1 个答案:

答案 0 :(得分:1)

纯粹的猜测:

  • 文件是utf-8编码的(或任何其他编码,SQL-Server 2008无法本机读取)。
    • 您必须知道,SQL-Server受文件编码的限制。 CHAR(或VARCHAR)为extended ASCII 1-byte encodingNCHAR(或NVARCHAR)为UCS-2 2-byte encoding(与UTF-16几乎相同)。
    • 使用SQL-Server 2016(以及v2014的SP2)引入了一些进一步的支持,特别是对utf-8
    • 尝试使用适当的编辑器(例如notepad ++)打开XML,并尝试找出文件的编码。尝试将其保存为“unicode / UCS-2 / utf-16”并重试导入。
    • 尝试使用CLOB代替BLOB来导入。将文件读取为二进制 LargeObject将使用下一个字节。 SQL-Server将尝试将这些字节读取为每个字符固定大小的字符串。 字符 LOB可能在特殊情况下有效。
    • 检查前两个字节是否为BOM(字节顺序标记)
  • XML中有一些 dirt
    • 使用HEX编辑器打开文件并尝试查找奇怪的代码
  • 您的代码在动态创建的语句中处理文件的内容。
    • 在这种情况下,有时会遇到截断或字符串断开的引号
  • 一般提示:
    • 如果您导入数据且预计会出现问题,强烈建议您使用两步法
    • 将您的文件读入容忍登台表(包含NVARCHAR(MAX)甚至VARBIANRY(MAX)目标列)并尝试继续此操作。
    • 在导入之前,可能需要使用其他工具来更改文件。