最近公司项目需要在数据库中操作XML,因此系统的学习了一下

一、openxml的格式

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

参数含义

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

XPath 模式,用来标识要作为行处理的节点。

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

用sql语句准备一段XML

declare @idoc int
declare @doc nvarchar(1000)
set @doc=N'<root>
<customer cid="c1" name="Janine" city="Issaquah">
<order oid="01" data="1/20/1996" amount="3.5"/>
<order oid="02" data="4/30/1997" amount="13.4">Customer was very satisfied</order>
</customer>
<customer cid="c2" name="Ursula" city="Oelde">
<order oid="03" data="7/14/1999" amount="100" note="Wrap it blue white red" >
<Urgency>Impotant</Urgency>
</order>
<order oid="04" date="1/20/1996" amount="10000"/>
</customer>
</root>'
exec sp_xml_preparedocument @idoc out,@doc --declare @temp char(5)
select * from openxml(@idoc,'/root/customer/order',0)
with (oid char(5),--属性
Urgency varchar(50),--元素
commont ntext '@mp:xmltext'
)

Flags为0时   使用“以属性为中心”的映射

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

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

Flags为3时   1和2是可以组合使用的,组合的同时1和2的结果都可以显示

若属性名字与元素名字相同,那么在这种情况下则是首先应用“以属性为中心”的映射,然后对所有未处理的列应用“以元素为中心”的映射 即先显示属性再显示元素

Flags为8时  在检索的上下文中,该标志指示不应将已使用的数据复制到溢出属性 @mp:xmltext

如果不指定WITH子句,查询出来的是一个默认的表结构,如下:

当flag=2 却仍然需要显示属性时 可以用如下代码

select * from openxml(@idoc,'/root/customer/order',2)
with (oid1 char(5) '@oid',
oid char(5),--属性
Urgency varchar(50),--元素
commont ntext '@mp:xmltext'
)     

显示如下

即只要在with的最后一个参数中,加上XML中想要的标签名称就可以了 这里要注意路径

数据库中操作XML(openXML)的更多相关文章

  1. VBA中操作XML

    OFFICE2007之后使用了OpenXml标准(伟大的改变),定制文本级的Ribbon可以通过修改压缩包内的xml文件来实现. 先学习一下VBA中操作XML的方法 先引用Microsoft XML ...

  2. VC++中操作XML(MFC、SDK)转

    [转]VC++中操作XML(MFC.SDK) XML在Win32程序方面应该没有在Web方面应用得多,很多Win32程序也只是用XML来存存配置信息而已,而且没有足够的好处的话还不如用ini.VC++ ...

  3. C#.Net中操作XML方法一

    我们知道XML是一种可标记性的语言,用来标记数据.定义数据类型,是一种执行用户对自己的标记语言进行定义的源语言.由于结构好.而且easy理解,就好比一棵树,层次关系分明,因此也经常把一些数据存储到XM ...

  4. 第12章 在.NET中操作XML

    12.1 XML概述 12.1.1 为什么要有XML 12.1.2 XML文档结构 (1)文档声明 <?xml version="1.0"encoding="UTF ...

  5. [转]VC++中操作XML(MFC、SDK)

    XML在Win32程序方面应该没有在Web方面应用得多,很多Win32程序也只是用XML来存存配置信息而已,而且没有足够的好处的话还不如用ini.VC++里操作XML有两个库可以用:MSXML和Xml ...

  6. 从数据库中生成XML文件

    前台页面<%@ page language="java" contentType="text/html; charset=utf-8" pageEncod ...

  7. Java读取数据库中的xml格式内容,解析后修改属性节点内容并写回数据库

    直接附代码: 1.测试用的xml内容 <mxGraphModel> <root> <mxCell id="-1" /> <mxCell i ...

  8. C#中操作xml文件(插入节点、修改、删除)

    已知有一个xml文件(bookstore.xml)如下: <?xml version="1.0" encoding="gb2312"?> <b ...

  9. Flex中操作XML的E4X方法

    用于处理 XML 的 E4X 方法 Flash Player 9 和更高版本,Adobe AIR 1.0 和更高版本   ECMAScript for XML 规范定义了一组用于使用 XML 数据的类 ...

随机推荐

  1. JS实现信息的显示和隐藏

    JS实现信息的显示和隐藏 我们在写注册页面的时候,必填信息是可见的,可选信息是隐藏的,如果用户希望填写,可以单击“详细信息”. 代码如下:<!DOCTYPE html><html&g ...

  2. JAVA GUI学习 - JTable表格组件学习_A ***

    public class JTableKnow_A extends JFrame { public JTableKnow_A() { this.setBounds(300, 100, 400, 300 ...

  3. Linux下安装VNC Server

    操作系统centos6.5,在其之上安装vnc server,可利用windows上的vnc client远程登录. 1. 安装 yum install tigervnc-server.x86_64 ...

  4. Boost.Asio基础(五) 异步编程初探

    异步编程 本节深入讨论异步编程将遇到的若干问题.建议多次阅读,以便吃透这一节的内容,这一节是对整个boost.asio来说是非常重要的. 为什么须要异步 如前所述,通常同步编程要比异步编程更简单.同步 ...

  5. x0vncserver Fatal server error: no screens found

    I make a connection through SSH and  then I type: # x0vncserver --PasswordFile=/home/hello/.vnc/pass ...

  6. oracle 分组后取每组第一条数据

    ‘数据格式 分组取第一条的效果 sql SELECT * FROM (SELECT ROW_NUMBER() OVER(PARTITION BY x ORDER BY y DESC) rn, test ...

  7. 一些常用的Intent及intent-filter的信息

    Uri Action 功能 备注 geo:latitude,longitude Intent.ACTION_VIEW 打开地图应用程序并显示指定的经纬度   geo:0,0?q=street+addr ...

  8. javaEE的13种核心技术规范

    javaEE平台由一整套服务(Services).应用程序接口(APIs)和协议构成,它对开发基于Web的多层应用提供了功能支持,下面对javaEE中的13种技术规范进行简单的记录:   J2EE中的 ...

  9. spring和mybatis整合进行事务管理

    1.声明式实现事务管理 XML命名空间定义,定义用于事务支持的tx命名空间和AOP支持的aop命名空间: <beans xmlns="http://www.springframewor ...

  10. new[] class deconstructor

    Class class(); Class *class1=new class; class1=&class; delete class1;   // Assert 指针指向的是一个栈中的对象, ...