• ----:)欢迎访问源码网(:----
    • 首页
    • 博客
    • 学院
    • 下载
    • 论坛
    • 影视
    • 发布源码
    • RSS
    • ITPig
    • 笑话网
    • 百家姓
    • 繁體中文

源码网 - 中国第一源码门户
选择镜像:网通镜像 - 电信主站
  • 首 页
  • 新闻动态
  • 网站运营
  • 网页制作
  • WEB开发
  • 编程开发
  • 图像媒体
  • 操作系统
  • 数据库
  • 服务器
热门搜索 优化 SEO 故事 cms IIS7 MySQL 个人 AdSense 主题推广 | 文章搜索: 高级搜索
会员登录/控制面版您的位置: 学院首页 >> 数据库 >> MSSQL >> 详细内容
 

推荐文章

  • SQL数据库的备份、压缩与SQL数据库数据处理的方法
  • 压缩SQL数据库
 
 

热点文章

  • 安装SQL Server 2005实例环境图解
  • SQL数据库的备份、压缩与SQL数据库数据处理的方法
  • SQL SERVER 2005数据库镜像
  • SQL数据库还原出现错误112(磁盘空间不足)的解决办法
  • 如何使用SQL Server 2000中的XML功能
  • Server 2005性能排错
  • SQL Server 2000中的SQL语言简介
  • 在SQL Server中的关系型数据仓库分区策略
  • SQLServer删除日志方法
  • 压缩SQL数据库
  • SQL精妙语句
  • SQL Server 2000中的SQL语言简介(一)
 
 

相关文章

  • SQL Server 2000中全文检索的使用
  • SQL Server 2000中生成XML的技巧
  • 创建SQL Server 2000故障转移群集
  • SQL Server 2000中的SQL语言简介(一)
  • SQL Server 2000中的SQL语言简介
 
 

百度搜索

 
 

如何使用SQL Server 2000中的XML功能

  • 阅览次数:
  • 文章来源:
  • 原文作者:
  • 整理日期: 2007-04-06
  • 发表评论
  • 字体大小:
  • 小
  • 中
  • 大

插入和更新

由SQL Server sp_xml_preparedocument系统存储过程准备的XML文档可像其他任何表一样用于JOIN中。它们也可像其他任何行集合一样用于INSERT、UPDATE或DELETE记录。为了证明这一点,首先从OrderID 10285选择一系列Order Details行,并将它们填入一个ADO.NET数据集。然后,通过更改它们的数量和向该数据集添加若干Order Details行,修改某些现有的Order Details行,如下面的代码片断所示:



作了这些更改之后,该数据集给出了关于如何取用该数据集中已更改的数据并将其转变为XML的若干个选项。可以使用WriteXml方法写出作为DiffGram的数据、带有或不带有其架构的数据。还可以使用GetXml方法将数据置入XML。本例将使用DiffGram,因为它将包含修改行以及各行在修改前后的状态(用于UPDATES)。

DiffGram被传递给一个存储过程(如图 8所示),该存储过程从XML文档取出新的和更新的行,并将它们插入一个TABLE变量(@tblTemp)。请注意,图 8中的OPENXML函数使用XPath表达式来获取hasChanges属性的值。对于插入行该值为i,对于修改行为m。由于OPENXML函数能够筛选出行,因此只需将一个XML文档传递给该存储过程。接下来,适当的行被插入Order Details表,然后适当的Order Details行被更新。INSERT和UPDATE都被包装在一个事务内部,因此无论哪一个失败都可以回滚。

图 8 使用DiffGram进行插入和更新

CREATE PROCEDURE prInsertUpdateOrderDetailsFromXML @sXML NTEXT

AS

DECLARE @iDoc int, @OrderID int

EXEC sp_xml_preparedocument @iDoc output, @sXML,

'<ns xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"

xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"/>'

IF @@Error<>0

BEGIN

RETURN

END

BEGIN TRANSACTION

DECLARE @tblTemp TABLE (

OrderID INT,

ProductID INT,

UnitPrice MONEY,

Quantity SMALLINT,

Discount REAL,

ChangeType CHAR(1)

)

INSERT INTO @tblTemp

(OrderID, ProductID, UnitPrice, Quantity, Discount, ChangeType)

SELECT OrderID, ProductID, ProductPrice,

ProductQTY, Discount, ChangeType

FROM OpenXML(@iDoc,

'/diffgr:diffgram/NorthwindOrderDetailsData/OrderDetails', 2)

WITH (OrderID INT 'OrderID', ProductID INT 'ProductID',

ProductPrice MONEY 'UnitPrice',

ProductQTY SMALLINT 'Quantity', Discount REAL 'Discount',

ChangeType CHAR(1) '@diffgr:hasChanges')

IF @@Error<>0

BEGIN

EXEC sp_xml_removedocument @iDoc

ROLLBACK TRANSACTION

RETURN

END

EXEC sp_xml_removedocument @iDoc

INSERT INTO [Order Details]

(OrderID, ProductID, UnitPrice, Quantity, Discount)

SELECT OrderID, ProductID, UnitPrice, Quantity, Discount

FROM @tblTemp

WHERE ChangeType = 'i'

IF @@Error<>0

BEGIN

ROLLBACK TRANSACTION

RETURN

END

UPDATE [Order Details]

SET

UnitPrice = t.UnitPrice,

Quantity = t.Quantity,

Discount = t.Discount

FROM

@tblTemp t, [Order Details] od

WHERE

t.ChangeType = 'm'

AND od.OrderID = t.OrderID

AND od.ProductID = t.ProductID

IF @@Error<>0

BEGIN

ROLLBACK TRANSACTION

RETURN

END

COMMIT TRANSACTION

GO

EXEC sp_xml_removedocument @iDoc

INSERT INTO [Order Details]

(OrderID, ProductID, UnitPrice, Quantity, Discount)

SELECT OrderID, ProductID, UnitPrice, Quantity, Discount

FROM @tblTemp

WHERE ChangeType = 'i'

IF @@Error<>0

BEGIN

ROLLBACK TRANSACTION

RETURN

END

UPDATE [Order Details]

SET

UnitPrice = t.UnitPrice,

Quantity = t.Quantity,

Discount = t.Discount

FROM

@tblTemp t, [Order Details] od

WHERE

t.ChangeType = 'm'

AND od.OrderID = t.OrderID

AND od.ProductID = t.ProductID

IF @@Error<>0

BEGIN

ROLLBACK TRANSACTION

RETURN

END

COMMIT TRANSACTION

GO

通过OPENXML批量插入

   

通过DataAdapter和存储过程从数据集插入10行非常容易。但DataAdapter会一次一个地遍历数据集行来查找行状态为已插入的行,并执行与DataAdapter针对每一行的InsertCommand关联的存储过程。这意味着10次插入将导致对数据库的10次调用。当必要的更新较少时,这种ADO.NET代码和数据库之间的来回操作几乎不会引起什么明显变化。不过,当引入其他因素时,如并发用户数量大大增加或插入数百行时,性能可能会迅速降低。要插入100行,不必调用100次存储过程,而可以将这100行作为XML一次性传递到一个存储过程中。

与可下载的代码一起提供的示例ASP.NET应用程序将执行一个将n个客户插入到Customers表中的存储过程。ASP.NET代码在数据集中创建并添加100条客户记录。然后使用WriteXml方法输出XML数据,不包含其架构。该XML然后被传递给一个一次性插入100个客户的存储过程。与每插入一次便执行一个存储过程的一次一个地插入各个客户相比,这种插入批量数据的方法更为高效。

使用示例

   

若使用SQL Query Analyzer来测试该列中包含的FOR XML SQL,可能需要更改某些默认选项。例如,若要查询和返回XML,则要先增加结果窗格中每列的最大字符数。转到Options | Tools | Results,将Maximum Characters per Column设置增加到某一值,如4096。由于返回的XML在结果窗格中显示为单列,因此该XML不会在默认的256个字符处截止。最后,用户将能够看到该XML,如果愿意,还可以将它复制并粘贴到XML编辑器中。

结束语



XML和SQL Server集成的第一步是引入FOR XML和OPENXML功能。由于这种进步,我们能够直接从SQL Server数据库获取XML,而不必使用某些中间组件对其进行转换。我们还可以通过结合使用OPENXML函数和老式备用方法、SQL INSERT、UPDATE和DELETE语句,将XML返给数据库。这些XML功能只是SQL Server 2005将提供的XML收集支持中的第一步,但它们如今已可用于集成XML应用程序和SQL Server,是一些非常有效的工具。

[1] [2] [3] [4] [5]

上一篇:PHP使用zlib扩展实现页面GZIP压缩输出
下一篇:构建支持Master/Slave读写分离的数据库操作类
  • 网友评论:
  • 查看所有评论
  • 我要发表评论
您的网名:
留言主题:
你要发表的内容:

 

关于本站 | 广告联系 | 版权声明 | 网站地图 | 发布软件 | 帮助中心 | 源码论坛

Copyright © 2005-2007 CodePub.Com  程序支持:木翼  滇ICP备05005971号