实体化XML,实现多条数据多个表一次性插入

本文介绍了如何在SQL Server 2005中使用OPENXML函数将XML数据转换为行集视图,从而实现一次数据库调用即可批量插入多条数据到不同表中,以提高效率。通过示例展示了存储过程的创建和使用,强调了OPENXML在处理内存中的XML文档时需要注意的内存限制。

在SQL   Server2005中,微软延续了   2000中一个特性(即支持XML类型的数据),并加强了对XML   数据列、XML变量以及XML索引的支持。

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

一个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调用时产生的内存操作问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值