加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 06:44:42 所属栏目:MsSql教程 来源:网络整理
导读:我们有一个SQL Server 2008 R2数据库表,其中 XML存储在VARCHAR数据类型的列中. 我现在必须获取xml的一些元素. 所以我想首先将存储为VARCHAR数据类型的xml转换为存储为xml数据类型的xml. 示例: 表A. Id(int),ProductXML (varchar(max)) 表B. Id(int),ProductX
我们有一个SQL Server 2008 R2数据库表,其中 XML存储在VARCHAR数据类型的列中.

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

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

示例:

表A.

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

表B.

Id(int),ProductXML(XML)

我想将表A中的ProductXML转换为XML数据类型并插入表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类型关联的模式,则还会执行验证.有关更多信息,请参阅将Typed XML与Untyped 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))

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读