使用OPENXML函数将XML文档转换为行结果集

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介:

FOR XML子句都是将行结果集转换为XML结果集,那么如果想要将XML文档转换成行结果集,这时就要使用OPENXML函数。OPENXML在SQL Server 2000中就已经提供,但是在SQL Server 2005对该函数进行了增强。
OPENXML的语法为:

OPENXML( idoc  int   [  in ]  , rowpattern  nvarchar   [  in  ]  ,  [  flags byte [ in  ]  ] ) 
[  WITH ( SchemaDeclaration | TableName )  ]

第一个参数idoc是XML文档的句柄,该句柄需要通过调用 sp_xml_preparedocument 创建 XML 文档的内部表式形式来获得。参数rowpattern是一个XPATH模式,用来标识要作处理的节点。第三个参数中用1表示查询以属性为中心,2表示查询以元素为中心。最后WITH子句标识出要返回的字段。
使用OPENXML函数将该XML文档转换为行结果集的代码:

declare   @mydoc  xml
set   @mydoc = '
<Person>
  <row FirstName="Gustavo" LastName="Achong" />
  <row FirstName="Catherine" MiddleName="R." LastName="Abel" />
</Person>
' -- 定义XML文档
declare   @docHandle   int
Exec  sp_xml_preparedocument  @docHandle  OUTPUT, @mydoc
-- 获得XML文档的句柄
SELECT   *   FROM  OPENXML( @docHandle , ' /Person/row ' , 1 ) -- 1表示以属性为中心
WITH  (FirstName  nvarchar ( 50 ),MiddleName  nvarchar ( 50 ),LastName  nvarchar ( 50 ))

运行的结果为:
FirstName         MiddleName          LastName
----------------  ----------------    ----------------
Gustavo           NULL                Achong
Catherine         R.                  Abel
若将代码中OPENXML函数的第三个参数换为2那么将返回2行NULL值,因为2表示查询以元素为中心,而row节点下没有其他元素。同样的道理,如果给出的XML文档只有元素而没有属性,那么就要使用参数2而不能使用1 。那么如果想要查询出的数据一部分在元素的属性中,一部分在元素的子元素中那么我们可以将该参数换成3。查询语句及返回结果见代码:

declare   @mydoc  xml
set   @mydoc = '
<Products>
  <Product Category="Book">
    <Name>Windows 2008</Name>
    <Vendor>Vendor1</Vendor>
  </Product>
  <Product Category="Book">
    <Name>SQL2008</Name>
    <Vendor>Vendor2</Vendor>
  </Product>
</Products>
'
declare   @docHandle   int
Exec  sp_xml_preparedocument  @docHandle  OUTPUT, @mydoc
SELECT   *   FROM  OPENXML( @docHandle , ' /Products/Product ' , 3 )
WITH  (Category  nvarchar ( 50 ),Name  nvarchar ( 50 ),Vendor  nvarchar ( 50 ))

实际上第三个参数无论跟任何正整数SQL Server 2005都不会报错,微软官方MSDN中只给出了0、1、2、8这4个数字的意思。其实SQL Server 2005内部是根据第三个参数的二进制比特位上的值来确定查询的方式的。最后2位是00或01(比如:0、1、4、5等)就是以属性为中心进行查询,最后2为是10(比如:2、6、10等)就是以元素为中心的查询,而最后2位是11(比如:3、7等)就表示既要查询属性也要查询元素。

本文转自深蓝居博客园博客,原文链接:http://www.cnblogs.com/studyzy/archive/2007/12/10/988806.html,如需转载请自行联系原作者

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
相关文章
|
XML Java 测试技术
为测试框架model类自动生成xml结果集
问题:有大量类似于theProductId这样名字的字符串需要转换成the_product_id这种数据库column名的形式。 思路:见到(见)大写字母(缝)就插入(插)一个“_”字符(针)进去,最后把所有字母都转换为小写。
838 0
|
SQL XML JavaScript
Querying Microsoft SQL Server 2012 读书笔记:查询和管理XML数据 1 -使用FOR XML返回XML结果集
原文:Querying Microsoft SQL Server 2012 读书笔记:查询和管理XML数据 1 -使用FOR XML返回XML结果集 XML 介绍 ...
1014 0
|
3天前
|
XML 数据格式
小米备份descript.xml文件
小米备份descript.xml文件
11 0
|
14天前
|
XML Java 数据库连接
mybatis中在xml文件中通用查询结果列如何使用
mybatis中在xml文件中通用查询结果列如何使用
16 0
|
16天前
|
XML JavaScript 前端开发
xml文件使用及解析
xml文件使用及解析
|
1月前
|
XML C# 数据格式
使用C#操作XML文件
使用C#操作XML文件
11 0
|
1月前
|
Java
java实现遍历树形菜单方法——映射文件VoteTree.hbm.xml
java实现遍历树形菜单方法——映射文件VoteTree.hbm.xml
10 0
|
1月前
|
Kubernetes Cloud Native Java
Activiti 简介以及最新activiti依赖 pom.xml文件(使用时注意对应版本号)
Activiti 简介以及最新activiti依赖 pom.xml文件(使用时注意对应版本号)
39 1
|
1月前
|
XML Java 数据库连接
struts+hibernate+oracle+easyui实现lazyout组件的简单案例——hibernate的config文件(hibernate.cfg.xml)
struts+hibernate+oracle+easyui实现lazyout组件的简单案例——hibernate的config文件(hibernate.cfg.xml)
11 0