我有一个有效的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) ')
答案 0 :(得分:1)
纯粹的猜测:
utf-8
编码的(或任何其他编码,SQL-Server 2008无法本机读取)。
CHAR
(或VARCHAR
)为extended ASCII 1-byte encoding
,NCHAR
(或NVARCHAR
)为UCS-2 2-byte encoding
(与UTF-16
几乎相同)。utf-8
。CLOB
代替BLOB
来导入。将文件读取为二进制 LargeObject将使用下一个字节。 SQL-Server将尝试将这些字节读取为每个字符固定大小的字符串。 字符 LOB可能在特殊情况下有效。BOM
(字节顺序标记)NVARCHAR(MAX)
甚至VARBIANRY(MAX)
目标列)并尝试继续此操作。