在sp_xml_preparedocument中读取中文作为XML输入的问题

时间:2013-03-29 08:46:59

标签: sql-server sql-server-2008 tsql stored-procedures

我正在尝试为插入存储过程读取中文,XML读取SP将批量输入参数作为XML,然后使用“sp_xml_preparedocument”解析/读取它并插入表中。这里的问题是它正在读中文为“???”字符。

下面是xml阅读SP:

    DECLARE @idoc int;
    DECLARE @cnt int = 0;           

    EXEC sp_xml_preparedocument @idoc OUTPUT, '<?xml version="1.0" encoding="ISO-8859-1"?><DocumentElement><Specifications><ID>1</ID><Name>维</Name><Value>123</Value></Specifications><Specifications><ID>2</ID><Name>重量</Name><Value>123123</Value></Specifications></DocumentElement>'

    SELECT @cnt = COUNT(*)
    SELECT  ID, Name, Value
    FROM OPENXML (@idoc, '/DocumentElement/Specifications', 2)
    WITH (ID int, Name nvarchar(MAX), Value nvarchar(MAX))

输出是: -

   ID    Name     Value

   1     ?    123

   2     ??   123123

你可以看到Name就像汉字一样。我尝试将XML编码更改为UTF-8和UTF-16,但没有运气。

3 个答案:

答案 0 :(得分:2)

您能否以UTF-16而非ISO-8859-1展示文件?以下工作正常:

   DECLARE @xml XML = N'<?xml version="1.0" ?><DocumentElement><Specifications><ID>1</ID><Name>维</Name><Value>123</Value></Specifications><Specifications><ID>2</ID><Name>重量</Name><Value>123123</Value></Specifications></DocumentElement>'

    SELECT  x.value(N'ID[1]', 'int') as ID,
      x.value(N'Name[1]', 'nvarchar(max)') as Name,
      x.value(N'Value[1]', 'nvarchar(max)') as Value
    FROM @xml.nodes (N'/DocumentElement/Specifications') T(x);

请参阅SqlFiddle

答案 1 :(得分:1)

首先,需要使用N''将XML定义为Unicode字符串。

其次,SQL Server的XML处理不允许encoding属性发出错误

  

消息6602,级别16,状态2,过程sp_xml_preparedocument,第1行   错误描述是'从当前编码切换到指定   编码不受支持。'。

我想这个论点是,当SQL Server将UCS-2用于NVARCHAR时,不能有任何其他编码。

修复这两个错误将为您提供所需的结果。

答案 2 :(得分:0)

将变量声明为XML解决了我的问题。

在解析“Käufergarantierte”的角色时,对sp_xml_preparedocument的调用失败。将编码设置为UTF-16会引发错误“从当前编码切换到不支持的指定编码”。我将XML字符串作为参数从C#代码传递为NVARCHAR(MAX)。