T-SQL 解析xml
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相关推荐
- SQL 存储过程 解析XML
第一种说明: 我看过这样一篇文章,如下 在SQL Server2005中,微软延续了 2000中一个特性(即支持XML类型的数据),并加强了对XML 数据列.XML变量以及XML索引的支 ...
- sql server解析xml属性为表格_Mybatis中SqlSource解析流程详解
前面几篇文章都在详细分析mapper的加载过程,但是始终没有看到sql的解析过程,今天来详细分析下. 解析sql的位置 前面分析到不管是通过注解还是通过xml方式生成mapper,最终都是调用Mapp ...
- sql server解析xml属性为表格_[Mybatis][基础支持层]mapper xml sql 解析
该系列文章针对 Mybatis 3.5.1 版本 Mybatis 中 标签解析,主要是为了得到两大部分数据 1.Mapper.class 接口 2.SQL 执行语句,结果集映射关系等数据 在上一章中提 ...
- SQL Server XML数据解析(1)
很久就想写总结一下SQL Server解析XML数据的常用方法了,下面就给出一些示例,有事没事,你也可以参照着示例自己动手尝试着实现一下自己的需求. 示例1:从XML中解析数据到表变量 DECLARE ...
- java解析xml的三种方法
java解析XML的三种方法 1.SAX事件解析 package com.wzh.sax;import org.xml.sax.Attributes; import org.xml.sax.SAXEx ...
- c语言解析xml字符串_Python XML解析和处理(三十二)
XML是一种便携式的开源语言,允许程序员开发可由其他应用程序读取的应用程序,而不管操作系统和/或开发语言是什么. 1.什么是XML? 可扩展标记语言(XML)是一种非常像HTML或SGML的标记语言. ...
- 解析xml数据存入bean映射到数据库的 需求解决过程
解析xml数据存入bean映射到数据库的 需求解决过程 2017年12月19日 15:18:57 守望dfdfdf 阅读数:419 标签: xmlbean 更多 个人分类: 工作 问题 编辑 版权声明 ...
- Java解析XML汇总(DOM/SAX/JDOM/DOM4j/XPath)
http://blog.csdn.net/smcwwh/article/details/7183869 关键字:Java解析xml.解析xml四种方法.DOM.SAX.JDOM.DOM4j.XPath ...
- 解析XML时DTD的处理--解析时忽略,生成XML文件时加上。-- XML进阶
一.解析XML文件时,遇到DTD的定义要怎么办? 下面这段代码是ibatis配置文件,用w3c Dom(其实任意一种解析方式都是这样)都会从http://www.ibatis.com/dtd/sql- ...
- java saxreader_JAVA解析XML,SAXReader无法使用
写了段代码要解析XML文件. for (int p = 0; p < files.length; p++) { System.out.println("Dom4jxml2:333::& ...
最新文章
- 异步/等待-什么时候返回Task vs void?
- LeetCode Algorithm 剑指 Offer 57 - II. 和为s的连续正数序列
- 浅谈C/C++中的typedef和#define
- Python打包分发工具setuptools简介
- CentOS 6 rpm方式安装mysql
- ContextMenuStrip 类
- 【渝粤题库】陕西师范大学202101 公共政策学
- linux对目录进行操作,Linux 基础:对文件和目录进行操作的 Linux 和 Unix 命令 笔记...
- 多媒体技术开发迎来新常态
- js split参数为无效字符_互联网前端开发技术JavaScript字符串类型详解
- 50、多线程创建的三种方式之实现Runnable接口
- 数据库系统概念第六版课后习题答案-第一章
- AD9833数字信号发生器模块
- 直流电机+L298N电机驱动模块
- python取出列表的第一列_python取第一列
- smartbi 安装教程
- 【最新】2021年注册测绘师考试测绘案例分析真题及答案解析
- EasyPlayer-rtsp播放器中码率及帧率统计的实现方法
- Hadoop-HDFS的数据读写过程(详细过程与图解)
- 集成OpenLDAP与Kerberos实现统一认证(一):整合后台数据库
热门文章
- Knowledge Distillation(知识蒸馏)Review--20篇paper回顾
- 【图文并茂】通过实例理解word2vec之Skip-gram
- 191030_Lda主题模型
- 每日算法系列【LeetCode 658】找到 K 个最接近的元素
- TF2.0-tf.keras.callbacks.ModelCheckpoint
- LeetCode—数据库简单题(三)
- QCon全球软件开发大会:推动创新,实现技术落地
- “Java引领技术人生”巡讲活动圆满结束
- Java - 多线程Callable、Executors、Future
- 两台windows笔记本创建家庭组实现文件共享