sql-server - 将字符串转换为 xml 并插入 Sql Server

标签 sql-server tsql sql-server-2008-r2

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

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

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

示例:

表A

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

表B

Id(int), ProductXML(XML)

我想将Table A 中的ProductXML 转换为XML 数据类型并插入到Table B 中。

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

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

类似地尝试转换,但出现错误

XML Parsing : unable to switch encoding

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

关于XML:它庞大,节点多,结构动态变化。

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

最佳答案

请给我们一个 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 文档):

您可以通过强制转换 (CAST) 或转换 (CONVERT) 将任何 SQL Server 字符串数据类型(例如 [n][var]char、[n]text、varbinary 和 image)解析为 xml 数据类型将字符串转换为 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))

关于sql-server - 将字符串转换为 xml 并插入 Sql Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15953177/

相关文章:

sql-server - SQL Server 分组依据/排序依据

sql - 如何从两个查询的联合中选择前n个,其中需要通过单个查询对结果顺序进行排名?

sql-server - 在 Reporting Services 报表中隐藏页面滚动控件

SQL为每个用户获取最近修改的帖子

sql - 如何加速涉及 count(distinct()) 的 SQL Server 查询

sql - 我需要某种条件连接

sql - SQL Server 中的临时表

sql-server - 首先按最重复的记录排序

sql - 将存储过程的结果保存在表变量中

sql - 我可以将 SQL Server 排序顺序存储在变量中吗?