使用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等)就表示既要查询属性也要查询元素。

相关实践学习
使用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 数据格式
hutool将XML文档转换为String
hutool将XML文档转换为String
|
18天前
|
XML JavaScript 前端开发
XML文档节点导航与选择指南
XPath是XSLT的核心部分,用于XML文档的节点定位和选择。它采用路径表达式语法,包含200多个内置函数处理各种数据类型。XPath在编程语言如JavaScript中广泛使用,与XSLT配合进行XML转换和样式处理。它涉及7种节点类型,如元素、属性和文本,以及多种节点间关系,如父、子、同级等。XPath还使用轴(如ancestor、child)来描述节点间的关联,并支持运算符进行逻辑和数学操作。
27 0
XML文档节点导航与选择指南
|
6月前
|
XML JavaScript 前端开发
SAP UI5 本地开发如何实现 XML 和 JavaScript 代码的自动完成和嵌入式 API 文档自动显示试读版
SAP UI5 本地开发如何实现 XML 和 JavaScript 代码的自动完成和嵌入式 API 文档自动显示试读版
65 0
|
6月前
|
XML JavaScript 数据格式
使用Dom4J解析XML文档
XML解析的方式 XML常见的两种解析方式: DOM: 要求解析器将整个XML文件全部加载到内存中,生成一个Document对象 优点:元素和元素之间保留结构、关系,可以针对元素进行增删查改操作 缺点:如果XML文件过大,可能会导致内存溢出 SAX:是一种速度更快,更加高效的解析方式。它是逐行扫描,边扫描边解析,并且以事件驱动的方式来进行具体的解析,每解析一行都会触发一个事件 优点: 不会出现内存溢出的问题,可以处理大文件 缺点:只能读,不能写 概念辨析: 解析器就是根据不同的解析方式提供具体的实现。 为了方便开发人员来解析XML,有一些方便操作的类库。例如Dom4j其中就包含了很多解
59 0
|
6月前
|
XML 数据格式
关于 SAP UI5 XML 视图里控件事件处理函数名称中的 . (点号) 问题的讨论试读版
关于 SAP UI5 XML 视图里控件事件处理函数名称中的 . (点号) 问题的讨论试读版
36 0
|
XML 自然语言处理 JavaScript
SAP UI5 本地开发如何实现 XML 和 JavaScript 代码的自动完成和嵌入式 API 文档自动显示
SAP UI5 本地开发如何实现 XML 和 JavaScript 代码的自动完成和嵌入式 API 文档自动显示
|
XML 存储 消息中间件
Tsung MQTT协议简介及MQTT xml文档配置介绍
Tsung MQTT协议简介及MQTT xml文档配置介绍
128 0
|
XML JavaScript Java
Java采用4种方法处理XML文档
Java采用4种方法处理XML文档
|
XML 数据格式
使用XStream进行对象和xml的转换,极度舒适
使用XStream进行对象和xml的转换,极度舒适
124 0
使用XStream进行对象和xml的转换,极度舒适
|
XML Java 数据安全/隐私保护
java采用注解方式将JavaBean转换为XML并采用AES全报文加密
java采用注解方式将JavaBean转换为XML并采用AES全报文加密
262 0