用OPENXML将XML数据转换为关联数据

2016-02-19 14:46 28 1 收藏

今天天气好晴朗处处好风光,好天气好开始,图老师又来和大家分享啦。下面给大家推荐用OPENXML将XML数据转换为关联数据,希望大家看完后也有个好心情,快快行动吧!

【 tulaoshi.com - 编程语言 】

  从SQL Server 2000开始,微软开始支持XML类型的数据。在SQL Server2005中,微软延续了这一特性,并加强了对XML 数据列、XML变量以及XML索引的支持。

  在数据库中存储XML数据是一个很出色的特征。对于大部分的数据处理需求来讲,将XML数据格式化为其它关联数据是十分重要。这也是引入OPENXML函数的原因。OPENXML是一个SQL Server提供的函数,它的作用是接收XML数据,提供内存中 XML数据的行集视图。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  一个OPENXML函数用例

  在下面的例子中,我们将演示如何使用OPENXML函数。假定我们现在正在从事一个网上购物系统开发。在这个场景中,顾客选择登录网站方式购买多种产品。因为根据公司的商业模式,通过网站购物能够节省成本。我们假定大部分的顾客都购买了七件或者更多的商品。我们的目标是当客户频繁的访问网站的时候,要尽量减少数据库的调用。我们的想法是将网页上提交的采购需求存储为XML文档,并且将其中的XML数据以字符串的形式传送给数据库底层的程序处理。这样,我们就可以在一次数据库调用中将XML数据中的订单信息插入数据库中。

  我们该如何解决上面的问题呢?首先我们看看将要编辑的网页数据。一个简单的XML文档含有来自网站的很多核心信息,包括:产品名称、价格、日期以及顾客资料。列表A包含了一个简单的XML数据流。

ShoppingCart
Purchase ProductID="7" Price="10.00" SaleDate="10/11/2006" SaleBatchID = "4523" CustomerID = "2398"/
Purchase ProductID="99" Price="25.00" SaleDate="10/11/2006" SaleBatchID = "4523" CustomerID = "2398"/
Purchase ProductID="32" Price="12.00" SaleDate="10/11/2006" SaleBatchID = "4523" CustomerID = "2398"/
Purchase ProductID="11" Price="90.00" SaleDate="10/11/2006" SaleBatchID = "4523" CustomerID = "2398"/
Purchase ProductID="7" Price="50.00" SaleDate="10/11/2006" SaleBatchID = "4523" CustomerID = "2398"/
Purchase ProductID="8" Price="67.35" SaleDate="10/11/2006" SaleBatchID = "4523" CustomerID = "2398"/
Purchase ProductID="45" Price="29.99" SaleDate="10/11/2006" SaleBatchID = "4523" CustomerID = "2398"/
Purchase ProductID="54" Price="49.49" SaleDate="10/11/2006" SaleBatchID = "4523" CustomerID = "2398"/
/ShoppingCart

  列表A

  然后,我们需要设计一个网页接口提供存储程序的调用。通过调用这一存储程序,将XML数据流存储至数据库。列表B是这一存储程序的实现内容。

CREATE PROCEDURE usp_InsertShoppingCartOrder
(
  @xml XML
)
AS
BEGIN
   DECLARE @Pointer INT
   EXECUTE sp_xml_preparedocument @Pointer OUTPUT,@xml
   INSERT INTO WebSales
   (
      ProductID,
      SalePrice,
      SaleDate,
      SaleBatchID,
      CustomerID
   )
   SELECT
      ProductID,
      Price,
      SaleDate,
      SaleBatchID,
      CustomerID

FROM
   OPENXML (@Pointer,'/ShoppingCart/Purchase')
   WITH
   (
      ProductID INT,
      Price MONEY,
      SaleDate SMALLDATETIME,
      SaleBatchID INT,
      CustomerID INT
   )
   EXEC sp_xml_removedocument @Pointer
END

  列表B

  这一存储程序支持XML数据类型(SQL Server 2005中新特色)作为输入参数(我们也可以使用变量字符数据类型作为我们的输入参数,例如VARCHAR (max)或者定义VARCHAR数据类型)。

  接下来,我们调用系统程序sp_xml_preparedocument,它不仅创建了XML文档在内存中的表示,也允许XML文档作为调用参数。一旦我们拥有了指向内存中XML文档的句柄,就可以调用OPENXML函数。在函数调用中使用不同的参数,还可以对XML数据的返回结果集进行详细的控制。


  我们提供指向XML文档的句柄,并且通过XPATH查询返回想要的XML数据中的节点。OPENXML函数中的WITH子句允许指定返回数据的行集格式。一旦将数据插入到websales 表格中,就可以调用系统程序sp_xml_removedocument删除SQL Server 服务器内存中的XML数据。

  这个简单的例子演示了通过OPENXML函数来减少数据库调用次数的强大功能。OPENXML函数提供很大的灵活性,你既可以将所有的XML数据插入到SQL Server 数据表中,也可以拆分XML文件,将其插入到不同的SQL Server数据表中。通过这一技术,我们就可以在一次程序调用中插入8条记录,而不是像传统的技术那样,要通过8次操作实现。

  OPENXML的局限性

  调用OPENXML函数时要注意内存的使用情况。系统程序sp_xml_preparedocument 的返回值是指向内存中XML文档的句柄。所以,你最好不要使用OPENXML加载较大的XML文档,因为那样可能会造成服务器的内存溢出。

  在以后的文章中,我将会向你介绍如何使用SQL Server 2005提供的关于XML的一些新属性,这些新属性不仅能够实现OPENXML函数的功能,而且不需要考虑OPENXML调用时产生的内存操作问题。

  作者简介

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  Tim Chapman先生在一家位于Louisville, KY的银行从事数据库管理员的工作,拥有7年的IT工作经验。他还通过了微软的SQL Server 2000和SQL Server 2005认证。

来源:http://www.tulaoshi.com/n/20160219/1607865.html

延伸阅读
using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.IO; using System.Xml;  namespace MyWindows { /**//// summary /// 这个示例演示如何把Office文件编码为xml文件以及如何把生...
正在修改的第一个电子购物程序中需要处理购物订单和订单明细的读取/更新问题.他们在数据库中分成两个表存储,Order和OrderDetails.现在要把他们的数据读取出来,并创建一个Order的数据实体供程序使用.一开始的时候我考虑使用IDataReader读取数据,即打开两个数据库连接,一个用来读取Order,一个用来读取OrderDetails.后来感觉麻烦,就开始考虑使用xm...
标签: ASP
  1、ASP文件: <%@ LANGUAGE="VBSCRIPT" % <%option explicit% <% 'EXAMPLE AS:把数据库中一个每天24小时在线人数放到一个EXCEL文件中去 'AUTHOR    :钢铁工人 'EMAIL     :hello_hhb@21cn.com 'DATE      :2001-3-25 'TEST &...
标签: ASP
  function new_str(str) if instr(str,chr(34))<0 and str<"" then   str_split=split(str,chr(34))   i=1   str_s=""   for j=0 to ubound(str_split)-1    if i mod 2 then     str_s=str_s&str_split(j)&"“&quo...
标签: Web开发
    我们常常会碰到需要处理以各种格式(从以逗号或者制表符做分隔符的文件到更负载的格式)保存或者传输的数据的情况,对每一种格式你都需要对应的解析器(parser)。这一缺点减缓了开发进度,而且可能会导致错误的发生。一个解决方案就是把常用格式的数据转化成XML文档,然后对它进行保存、处理或者转换成其它格式。 一个...

经验教程

762

收藏

89
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部