1

我正在尝试为我的插入存储过程读取中文,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>维&lt;/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 是作为 ??s in-place of Chinese characters 来的。我尝试将 XML 编码更改为 UTF-8 和 UTF-16,但没有运气。

4

3 回答 3

2

您能否将文档显示为 UTF-16 而不是 ISO-8859-1?以下工作正常:

   DECLARE @xml XML = N'<?xml version="1.0" ?><DocumentElement><Specifications><ID>1</ID><Name>维&lt;/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

于 2013-03-29T09:54:45.087 回答
1

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

其次,SQL Server 的 XML 处理不允许该encoding属性,因为它会发出错误

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

我猜这个论点是因为 SQL Server 将 UCS-2 用于 NVARCHAR,所以不能有任何其他编码。

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

于 2013-03-29T10:00:57.140 回答
1

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

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

于 2015-12-31T09:41:55.720 回答