OPENXML 通过 XML 文档提供行集视图。由于 OPENXML 是行集提供程序,因此可在会出现行集提供程序(如表、视图或 OPENROWSET 函数)的 Transact-SQL 语句中使用 OPENXML。

Transact-SQL 语法约定

语法


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

参数


idoc

XML 文档的内部表式形式的文档句柄。通过调用 sp_xml_preparedocument 创建 XML 文档的内部表式形式。

rowpattern

XPath 模式,用来标识要作为行处理的节点(这些节点在 XML 文档中,该文档的句柄由 idoc 参数传递)。

flags

指示应在 XML 数据和关系行集间使用映射以及应如何填充溢出列。flags 为可选输入参数,可以是下列值之一:

字节值

说明

0

默认为“以属性为中心”的映射。

1

使用“以属性为中心”的映射。可以与 XML_ELEMENTS 一起使用。这种情况下,首先应用“以属性为中心”的映射,然后对所有未处理的列应用“以元素为中心”的映射。

2

使用“以元素为中心”的映射。可以与 XML_ATTRIBUTES 一起使用。这种情况下,首先应用“以属性为中心”的映射,然后对所有未处理的列应用“以元素为中心”的映射。

8

可与 XML_ATTRIBUTES 或 XML_ELEMENTS 组合使用(逻辑或)。在检索的上下文中,该标志指示不应将已使用的数据复制到溢出属性 @mp:xmltext

SchemaDeclaration

窗体的架构定义:ColNameColType [ColPattern | MetaProperty] [,ColNameColType [ColPattern | MetaProperty]...]

ColName

行集中的列名。

ColType

行集中列的 SQL Server 数据类型。如果列类型不同于属性的基础 xml 数据类型,则将发生类型强制。

ColPattern

可选的通用 XPath 模式,它说明应如何将 XML 节点映射到列。如果没有指定 ColPattern,则发生默认映射(由 flags 指定的“以属性为中心”或“以元素为中心”的映射)。

指定为 ColPattern 的 XPath 模式用于指定特殊的映射性质(如果发生“以属性为中心”和“以元素为中心”的映射),这些特殊的映射性质可以重写或增强由 flags 所指示的默认映射。

指定为 ColPattern 的通用 XPath 模式也支持元属性。

MetaProperty

由 OPENXML 提供的元属性之一。如果指定 MetaProperty,则该列包含元属性提供的信息。使用元属性可以提取有关 XML 节点的信息(如相对位置和命名空间信息)。它提供了比文本表示形式更详细的信息。

TableName

如果具有所需架构的表已经存在且不要求列模式,则为给定的表名(而不是 SchemaDeclaration)。

注释


通过使用 SchemaDeclaration 或指定一个现有 TableName,WITH 子句提供一种行集格式(根据需要还可提供其他映射信息)。如果没有指定可选的 WITH 子句,则以“边缘”表格式返回结果。边缘表在单个表中表示 XML 文档的细密结构(例如,元素/属性名、文档层次结构、命名空间、处理说明等)。

下表介绍了“边缘”表的结构。

列名

数据类型

说明

id

bigint

文档节点的唯一 ID。

根元素的 ID 值为 0。保留负 ID 值。

parentid

bigint

标识节点的父节点。此 ID 所标识的父节点不一定是父元素,而是取决于此 ID 所标识节点的子节点的 NodeType。例如,如果节点是文本节点,则其父节点可能是属性节点。

如果节点位于 XML 文档的顶层,则其 ParentID 为 NULL。

nodetype

int

标识节点类型。一个对应于 XML DOM 节点类型编号的整数。

节点类型包括:

1 = 元素节点

2 = 属性节点

3 = 文本节点

localname

nvarchar

给出元素或属性的本地名称。如果 DOM 对象没有名称,则为 NULL。

prefix

nvarchar

节点名称的命名空间前缀。

namespaceuri

nvarchar

节点的命名空间 URI。如果值为 NULL,则命名空间不存在。

datatype

nvarchar

元素或属性行的实际数据类型,否则为 NULL。数据类型是从内联 DTD 中或从内联架构中推断得出。

prev

bigint

前一个同级元素的 XML ID。如果前面没有同级元素,则为 NULL。

text

ntext

包含文本格式的属性值或元素内容(如果“边缘”表项不需要值,则为 NULL)。

示例


A. 使用带 OPENXML 的简单 SELECT 语句

以下示例使用 sp_xml_preparedocument 创建 XML 图像的内部表示形式。然后对 XML 文档的内部表示形式执行使用 OPENXML 行集提供程序的 SELECT 语句。

flag 值设置为 1。该值指示“以属性为中心”的映射。因此,XML 属性映射到行集中的列。指定为 /ROOT/Customer 的 rowpattern 标识要处理的 <Customers> 节点。

没有指定可选的 ColPattern(列模式)参数,因为列名与 XML 属性名称匹配。

OPENXML 行集提供程序创建了一个双列行集(CustomerID 和 ContactName),SELECT 语句从该行集中检索必要的列(在本例中检索所有的列)。

复制
DECLARE @idoc int
DECLARE @doc varchar(1000)
SET @doc ='
<ROOT>
<Customer CustomerID="VINET" ContactName="Paul Henriot"><Order CustomerID="VINET" EmployeeID="5" OrderDate="1996-07-04T00:00:00"><OrderDetail OrderID="10248" ProductID="11" Quantity="12"/><OrderDetail OrderID="10248" ProductID="42" Quantity="10"/></Order>
</Customer>
<Customer CustomerID="LILAS" ContactName="Carlos Gonzlez"><Order CustomerID="LILAS" EmployeeID="3" OrderDate="1996-08-16T00:00:00"><OrderDetail OrderID="10283" ProductID="72" Quantity="3"/></Order>
</Customer>
</ROOT>'
--Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
-- Execute a SELECT statement that uses the OPENXML rowset provider.
SELECT    *
FROM       OPENXML (@idoc, '/ROOT/Customer',1)WITH (CustomerID  varchar(10),ContactName varchar(20))

下面是结果集:

复制
CustomerID ContactName
---------- --------------------
VINET      Paul Henriot
LILAS      Carlos Gonzlez

如果将 flags 设置为 2(表示“以元素为中心”的映射)并执行相同的 SELECT 语句,则由于 <Customers> 元素没有任何子元素,所以针对 XML 文档中两个客户的 CustomerID 和 ContactName 的值都返回为 NULL。

下面是结果集:

复制
CustomerID ContactName
---------- -----------
NULL       NULL
NULL       NULL

B. 为列和 XML 属性之间的映射指定 ColPattern

下面的查询从 XML 文档返回客户 ID、订单日期、产品 ID 和数量等属性。rowpattern 标识 <OrderDetails> 元素。ProductID 和 Quantity 是 <OrderDetails> 元素的属性。而 OrderID、CustomerID 和 OrderDate 是父元素 (<Orders>) 的属性。

指定可选的 ColPattern。这包括以下各项:

  • 行集中的 OrderID、CustomerID 和 OrderDate 映射到 XML 文档中的 rowpattern 所标识节点的父节点属性。

  • 行集中的 ProdID 列映射到 ProductID 属性,行集中的 Qty 列映射到 rowpattern 中所标识节点的 Quantity 属性。

尽管“以元素为中心”的映射由 flags 参数指定,但 ColPattern 中指定的映射的优先级高于该映射。

复制
DECLARE @idoc int
DECLARE @doc varchar(1000)
SET @doc ='
<ROOT>
<Customer CustomerID="VINET" ContactName="Paul Henriot"><Order OrderID="10248" CustomerID="VINET" EmployeeID="5" OrderDate="1996-07-04T00:00:00"><OrderDetail ProductID="11" Quantity="12"/><OrderDetail ProductID="42" Quantity="10"/></Order>
</Customer>
<Customer CustomerID="LILAS" ContactName="Carlos Gonzlez"><Order OrderID="10283" CustomerID="LILAS" EmployeeID="3" OrderDate="1996-08-16T00:00:00"><OrderDetail ProductID="72" Quantity="3"/></Order>
</Customer>
</ROOT>'
--Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
-- SELECT stmt using OPENXML rowset provider
SELECT *
FROM   OPENXML (@idoc, '/ROOT/Customer/Order/OrderDetail',2)WITH (OrderID       int         '../@OrderID',CustomerID  varchar(10) '../@CustomerID',OrderDate   datetime    '../@OrderDate',ProdID      int         '@ProductID',Qty         int         '@Quantity')

下面是结果集:

复制
OrderID CustomerID           OrderDate                 ProdID    Qty
------------------------------------------------------------------------
10248      VINET       1996-07-04 00:00:00.000   11      12
10248      VINET       1996-07-04 00:00:00.000   42      10
10283      LILAS       1996-08-16 00:00:00.000   72      3

C. 获得边缘表格式的结果

以下示例中的示例 XML 文档由 <Customers>、<Orders> 和 <Order_0020_Details> 元素组成。首先调用 sp_xml_preparedocument 以获得文档句柄。此文档句柄传递给 OPENXML。

在 OPENXML 语句中,rowpattern (/ROOT/Customers) 标识要处理的 <Customers> 节点。由于未提供 WITH 子句,因此 OPENXML 以“边缘”表格式返回行集。

最后,SELECT 语句检索“边缘”表中的所有列。

复制
DECLARE @idoc int
DECLARE @doc varchar(1000)
SET @doc ='
<ROOT>
<Customers CustomerID="VINET" ContactName="Paul Henriot"><Orders CustomerID="VINET" EmployeeID="5" OrderDate="1996-07-04T00:00:00"><Order_x0020_Details OrderID="10248" ProductID="11" Quantity="12"/><Order_x0020_Details OrderID="10248" ProductID="42" Quantity="10"/></Orders>
</Customers>
<Customers CustomerID="LILAS" ContactName="Carlos Gonzlez"><Orders CustomerID="LILAS" EmployeeID="3" OrderDate="1996-08-16T00:00:00"><Order_x0020_Details OrderID="10283" ProductID="72" Quantity="3"/></Orders>
</Customers>
</ROOT>'
--Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
-- SELECT statement that uses the OPENXML rowset provider.
SELECT    *
FROM       OPENXML (@idoc, '/ROOT/Customers')
EXEC sp_xml_removedocument @idoc

转载于:https://www.cnblogs.com/taoys/archive/2011/08/03/2126376.html

T-SQL 解析xml相关推荐

  1. SQL 存储过程 解析XML

    第一种说明: 我看过这样一篇文章,如下  在SQL   Server2005中,微软延续了   2000中一个特性(即支持XML类型的数据),并加强了对XML   数据列.XML变量以及XML索引的支 ...

  2. sql server解析xml属性为表格_Mybatis中SqlSource解析流程详解

    前面几篇文章都在详细分析mapper的加载过程,但是始终没有看到sql的解析过程,今天来详细分析下. 解析sql的位置 前面分析到不管是通过注解还是通过xml方式生成mapper,最终都是调用Mapp ...

  3. sql server解析xml属性为表格_[Mybatis][基础支持层]mapper xml sql 解析

    该系列文章针对 Mybatis 3.5.1 版本 Mybatis 中 标签解析,主要是为了得到两大部分数据 1.Mapper.class 接口 2.SQL 执行语句,结果集映射关系等数据 在上一章中提 ...

  4. SQL Server XML数据解析(1)

    很久就想写总结一下SQL Server解析XML数据的常用方法了,下面就给出一些示例,有事没事,你也可以参照着示例自己动手尝试着实现一下自己的需求. 示例1:从XML中解析数据到表变量 DECLARE ...

  5. java解析xml的三种方法

    java解析XML的三种方法 1.SAX事件解析 package com.wzh.sax;import org.xml.sax.Attributes; import org.xml.sax.SAXEx ...

  6. c语言解析xml字符串_Python XML解析和处理(三十二)

    XML是一种便携式的开源语言,允许程序员开发可由其他应用程序读取的应用程序,而不管操作系统和/或开发语言是什么. 1.什么是XML? 可扩展标记语言(XML)是一种非常像HTML或SGML的标记语言. ...

  7. 解析xml数据存入bean映射到数据库的 需求解决过程

    解析xml数据存入bean映射到数据库的 需求解决过程 2017年12月19日 15:18:57 守望dfdfdf 阅读数:419 标签: xmlbean 更多 个人分类: 工作 问题 编辑 版权声明 ...

  8. Java解析XML汇总(DOM/SAX/JDOM/DOM4j/XPath)

    http://blog.csdn.net/smcwwh/article/details/7183869 关键字:Java解析xml.解析xml四种方法.DOM.SAX.JDOM.DOM4j.XPath ...

  9. 解析XML时DTD的处理--解析时忽略,生成XML文件时加上。-- XML进阶

    一.解析XML文件时,遇到DTD的定义要怎么办? 下面这段代码是ibatis配置文件,用w3c Dom(其实任意一种解析方式都是这样)都会从http://www.ibatis.com/dtd/sql- ...

  10. java saxreader_JAVA解析XML,SAXReader无法使用

    写了段代码要解析XML文件. for (int p = 0; p < files.length; p++) { System.out.println("Dom4jxml2:333::& ...

最新文章

  1. 异步/等待-什么时候返回Task vs void?
  2. LeetCode Algorithm 剑指 Offer 57 - II. 和为s的连续正数序列
  3. 浅谈C/C++中的typedef和#define
  4. Python打包分发工具setuptools简介
  5. CentOS 6 rpm方式安装mysql
  6. ContextMenuStrip 类
  7. 【渝粤题库】陕西师范大学202101 公共政策学
  8. linux对目录进行操作,Linux 基础:对文件和目录进行操作的 Linux 和 Unix 命令 笔记...
  9. 多媒体技术开发迎来新常态
  10. js split参数为无效字符_互联网前端开发技术JavaScript字符串类型详解
  11. 50、多线程创建的三种方式之实现Runnable接口
  12. 数据库系统概念第六版课后习题答案-第一章
  13. AD9833数字信号发生器模块
  14. 直流电机+L298N电机驱动模块
  15. python取出列表的第一列_python取第一列
  16. smartbi 安装教程
  17. 【最新】2021年注册测绘师考试测绘案例分析真题及答案解析
  18. EasyPlayer-rtsp播放器中码率及帧率统计的实现方法
  19. Hadoop-HDFS的数据读写过程(详细过程与图解)
  20. 集成OpenLDAP与Kerberos实现统一认证(一):整合后台数据库

热门文章

  1. Knowledge Distillation(知识蒸馏)Review--20篇paper回顾
  2. 【图文并茂】通过实例理解word2vec之Skip-gram
  3. 191030_Lda主题模型
  4. 每日算法系列【LeetCode 658】找到 K 个最接近的元素
  5. TF2.0-tf.keras.callbacks.ModelCheckpoint
  6. LeetCode—数据库简单题(三)
  7. QCon全球软件开发大会:推动创新,实现技术落地
  8. “Java引领技术人生”巡讲活动圆满结束
  9. Java - 多线程Callable、Executors、Future
  10. 两台windows笔记本创建家庭组实现文件共享