11

我们有一个 SQL Server 2008 R2 数据库表,其中 XML 存储在VARCHAR数据类型的列中。

我现在必须获取 xml 的一些元素。

所以我想首先将存储为数据类型的 xml 转换为存储为VARCHAR数据类型的 xml xml

例子 :

表 A

Id(int) , ProductXML (varchar(max))

表 B

Id(int), ProductXML(XML)

我想将ProductXMLfromTable A转换为 XML 数据类型并插入Table B.

我尝试使用CAST()andCONVERT()函数,如下所示:

insert into TableB (ProductXML)
select CAST(ProductXML as XML) from TableA;

同样尝试转换,但我得到一个错误

XML 解析:无法切换编码

有什么办法可以将varchar表中的条目转换为 XML 条目?

关于XML:它很大,有很多节点,而且它的结构是动态变化的。

示例:一行可以有一个产品的 XML 条目,另一行可以有多个产品的 xml 条目。

4

2 回答 2

32

给我们一个您的 XML 样本,因为所有这些都可以工作:

CONVERT(XML, '<root><child/></root>')
CONVERT(XML, '<root>          <child/>         </root>', 1)
CAST('<Name><FName>Carol</FName><LName>Elliot</LName></Name>'  AS XML)

此外,您可能必须先将其转换为 nvarchar 或 varbinary(来自 Microsoft 文档):

您可以通过将任何 SQL Server 字符串数据类型(例如 [n][var]char、[n]text、varbinary 和 image)解析为 xml 数据类型,方法是将字符串转换为 (CAST) 或将字符串转换为 (CONVERT) xml 数据类型。检查无类型 XML 以确认其格式正确。如果存在与 xml 类型关联的模式,则还会执行验证。有关详细信息,请参阅将类型化 XML 与非类型化 XML 进行比较。

XML 文档可以使用不同的编码(例如,UTF-8、UTF-16、windows-1252)进行编码。下面概述了有关字符串和二进制源类型如何与 XML 文档编码交互以及解析器如何行为的规则。

由于 nvarchar 采用两字节 unicode 编码,例如 UTF-16 或 UCS-2,因此 XML 解析器会将字符串值视为两字节 Unicode 编码的 XML 文档或片段。这意味着 XML 文档需要以两字节 Unicode 编码进行编码,以便与源数据类型兼容。UTF-16 编码的 XML 文档可以具有 UTF-16 字节顺序标记 (BOM),但它不需要,因为源类型的上下文清楚地表明它只能是两个字节的 Unicode 编码文档。

XML 解析器将 varchar 字符串的内容视为单字节编码的 XML 文档/片段。由于 varchar 源字符串具有关联的代码页,如果 XML 本身未指定显式编码,则解析器将使用该代码页进行编码 如果 XML 实例具有 BOM 或编码声明,则 BOM 或声明需要与代码页一致,否则解析器会报错。

varbinary 的内容被视为直接传递给 XML 解析器的代码点流。因此,XML 文档或片段需要内嵌提供 BOM 或其他编码信息。解析器只会查看流以确定编码。这意味着 UTF-16 编码的 XML 需要提供 UTF-16 BOM,并且没有 BOM 且没有声明编码的实例将被解释为 UTF-8。

如果事先不知道 XML 文档的编码,并且在转换为 XML 之前将数据作为字符串或二进制数据而不是 XML 数据传递,则建议将数据视为 varbinary。例如,当使用 OpenRowset() 从 XML 文件中读取数据时,应该将要读取的数据指定为 varbinary(max) 值:

select CAST(x as XML) 
from OpenRowset(BULK 'filename.xml', SINGLE_BLOB) R(x)

SQL Server 在内部以使用 UTF-16 编码的高效二进制表示形式表示 XML。不保留用户提供的编码,但在解析过程中会考虑。

解决方案:

CONVERT(XML, CONVERT(NVARCHAR(max), ProductXML))
于 2013-04-11T15:48:13.443 回答
4

这对我有用:

select CAST(REPLACE(CAST(column3 AS NVARCHAR(MAX)),'utf-8','utf-16') AS XML) from table
于 2017-12-20T14:07:58.193 回答