当前位置:  数据库>sqlserver

使用sp_xml_preparedocument处理XML文档的方法

    来源: 互联网  发布时间:2014-10-04

    本文导语:  有时会在存储过程中处理一些XML格式的数据,所以会用到sp_xml_preparedocument,他可以将XML数据进行读取,然后使用 MSXML 分析器 (Msxmlsql.dll) 对其进行分析。我们就可以很容易的在存储过程中得到XML中我们想要的数据。下面的代码...

有时会在存储过程中处理一些XML格式的数据,所以会用到sqlserver iis7站长之家,他可以将XML数据进行读取,然后使用 MSXML 分析器 (Msxmlsql.dll) 对其进行分析。我们就可以很容易的在存储过程中得到XML中我们想要的数据。下面的代码就是使用sp_xml_preparedocument读取XML:

代码如下:

DECLARE @hdoc int
DECLARE @doc varchar(1000)
SET @doc ='












'
EXEC sp_xml_preparedocument @hdoc OUTPUT, @doc

上面只是读取了XML,要想获取XML数据还需要使用OPENXML,代码如下:
代码如下:

SELECT *
FROM openxml(@hdoc,'/ROOT/Customer',1)
WITH (CustomerID VARCHAR(40),ContactName VARCHAR(40))

OPENXML有三个参数:
第一个是sp_xml_preparedocument读取是的OUTPUT参数,在本示例中就是@hdoc;
第二个是一个XPath表达式,用来获取指定位置的数据;
第三个是一个可选项,用来表示获取的方式,有0,1,2,8四种取值,详细解释请看
FROM后面的WITH也是可选的,用来指定获取哪些数据字段,上面代码中只取了CustomerID和ContactName。上面的查询结果如下:
CustomerID ContactName
—————————————- —————————————-
VINET Paul Henriot
LILAS Carlos Gonzlez
如果不指定WITH子句,查询出来的是一个默认的表结构,如下:


表格列的解释说明:

列名 数据类型 说明 id bigint 文档节点的唯一 ID。

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

parentid bigint 标识节点的父节点。此 ID 标识的父节点不一定是父元素。具体情况取决于此 ID 所标识节点的子节点的节点类型。例如,如果节点为文本节点,则其父节点可能是一个属性节点。

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

节点类型 int 标识节点类型,是对应于 XML 对象模型 (DOM) 节点类型编号的一个整数。

下列值是可以显示在此列中以指明节点类型的值:

1 = 元素节点

2 = 属性节点

3 = 文本节点

4 = CDATA 部分节点

5 = 实体引用节点

6 = 实体节点

7 = 处理指令节点

8 = 注释节点

9 = 文档节点

10 = 文档类型节点

11 = 文档片段节点

12 = 表示法节点

有关详细信息,请参阅 Microsoft XML (MSXML) SDK 中的“节点类型属性”主题。

localname nvarchar(max) 提供元素或属性的本地名称。如果 DOM 对象没有名称,则为 NULL。 prefix nvarchar(max) 节点名称的命名空间前缀。 namespaceuri nvarchar(max) 节点的命名空间 URI。如果值是 NULL,则命名空间不存在。 datatype nvarchar(max) 元素或属性行的实际数据类型,否则是 NULL。数据类型是从内联 DTD 中或从内联架构中推断得出。 prev bigint 前一个同级元素的 XML ID。如果前面没有同级元素,则为 NULL。 text ntext 包含文本形式的属性值或元素内容。如果边缘表项不需要值则为 NULL。

在WITH子句中,我们还可以通过设置来获取父级元素的属性值:

代码如下:

DECLARE @hdoc int
DECLARE @doc varchar(1000)
SET @doc ='












'

EXEC sp_xml_preparedocument @hdoc OUTPUT, @doc
SELECT *
FROM OPENXML (@hdoc, '/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
有时候XML中的数据并不是以属性的方式存在,而是直接放在节点中,如下:
代码如下:

DECLARE @doc varchar(1000)
SET @doc ='



10248
VINET
5
1996-07-04T00:00:00


'

此时要获Order节点下的各项的值,可以用下面方法:
代码如下:

DECLARE @hdoc int
DECLARE @doc varchar(1000)
SET @doc ='



10248
VINET
5
1996-07-04T00:00:00


'
EXEC sp_xml_preparedocument @hdoc OUTPUT, @doc
SELECT *
FROM OPENXML (@hdoc, '/ROOT/Customer/Order',1)
WITH (OrderID int 'OrderID',
CustomerID varchar(10) 'CustomerID',
EmployeeID int 'EmployeeID',
OrderDate datetime 'OrderDate')

查询结果如下:
OrderID CustomerID EmployeeID OrderDate
———– ———- ———– ———————–
10248 VINET 5 1996-07-04 00:00:00.000
可以看出是取属性值还是取节点的文本的值区别在于WITH子句的第三个参数是否有@符号

    
 
 

您可能感兴趣的文章:

  • 求freebsd 5.2 的安装手册(文档)和配置使用文档。谢谢各位了。
  • 使用标准SAX解析XML文档如何获取文档编码信息及约束它的dtd文件路径.
  • 请教,如何使用JDOM操作XML文档?
  • Mbuni 文档 谁来翻译下 安装上了,怎么使用啊
  • 哪里可以找到java类库方面的帮助文档,在JDK上使用!!!!!
  • 请问哪里有WEBLOGIC6.1的使用说明文档!
  • 哪里能找到关于tomcat使用说明的中文文档
  • 请教如何在LINUX下使用中文输入法编辑文档啊?
  • 请问各位到那能找到GCC的使用说明文档(电子版)
  • 求Eclipse的使用方法的中文电子文档
  • JDOM的文档在哪里下载?请给具体连接地址。还有,是否总是使用JDOM代替DOM?
  • 哪位有apache与tomcat结合使用的相关配置文档?请告诉小弟,只要是有用的,通统给分!
  • freetds_jdbc.jar谁会用,那里可以找到它的使用文档?
  • 使用自定义.jar压缩文档的问题!
  • 用过JCreator的高手们,怎样使用JCreator自动生成Javadoc文档呢?
  • java文档说TreeMap使用的储存结构是Red-Black树,请问什么是Red-Black树,和Btree一样吗?
  • 使用xmltextreader对象读取xml文档示例
  • 结构化文档全文索引的使用方式,以DB2 TIE为例,讲解一下结构化文档的全文索引的使用方法,希望对我的另一个帖子起到抛砖引玉的作用。
  • PHP中使用TCPDF生成PDF文档实例
  • 使用c#在word文档中创建表格的方法详解
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • c/c++预处理命令预#,##使用介绍
  • linux 下多线程 每个线程能否使用alarm来处理,信号是否会乱呢?
  • 中断处理函数中使用自旋锁的疑问
  • 操作系统的使用的处理死锁的算法
  • linux下如何使用awk等命令处理 .ods 或 .xls 文件
  • 使用epoll lt或者et 每次wait到一个事件处理完后是否需要重新投递事件呢?
  • 基于jdbc处理Clob的使用介绍
  • 纯技术贴开始:如何使用HOOK从内核偷包处理,绕开协议栈?????
  • asp.net使用mshtml处理html的代码
  • 使用脚本处理xml
  • 在netfilter中使用NF_QUEEN把数据交由用户进程处理,碰到倒霉事,郁闷啊。。
  • 关于linux下编程如果处理设备在使用过程被卸去的问题
  • 如何使用JSP/SERVLET处理frameset的问题,难?
  • android教程使用webview访问https的url处理sslerror示例
  • GTK使用空闲处理函数解决线程同步时出现的一个诡异现象
  • UNIX下面能否使用类似BCP的程序连接另一台UNIX下面的Sybase数据库进行数据处理
  • 浅析python 内置字符串处理函数的使用方法
  • php异常处理使用示例
  • android开发教程之使用looper处理消息队列
  • c/c++ 使用指针函数后的内存怎么处理?
  • 为什么内核模块在中断处理中(INT3),使用current->tgid,机子就会死掉[suse11 linux-2.6.27.45-0.1]
  • C++ I/O 成员 tellg():使用输入流读取流指针
  • 在测试memset函数的执行效率时,分为使用Cash和不使用Cash辆种方式,该如何控制是否使用缓存?
  • C++ I/O 成员 tellp():使用输出流读取流指针
  • 求ibm6000的中文使用手册 !从来没用过服务器,现在急需使用它,不知如何使用! 急!!!!!
  • Python不使用print而直接输出二进制字符串
  • 请问:在使用oracle数据库作开发时,是使用pro*c作开发好些,还是使用库函数如oci等好一些啊?或者它们有什么区别或者优缺点啊?
  • Office 2010 Module模式下使用VBA Addressof
  • 急求结果!!假设一个有两个元素的信号量集S,表示了一个磁带驱动器系统,其中进程1使用磁带机A,进程2同时使用磁带机A和B,进程3使用磁带机B。
  • windows下tinyxml.dll下载安装使用(c++解析XML库)
  • c#中SAPI使用总结——SpVoice的使用方法


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3