用XML字符当存储过程的参数

创建几个带不同参数的存储过程去完成同一样任务对我们来说一直以来都是一个负担。通过使用XML 字符串传递参数给你的存储过程可以简化这个任务,从而使设计COM组件变得更加简单。
达到这个目标的方法是将你的参数作为一个XML 字符串传入,然后解析XML以取得你需要的数据,最后继续完成你需要实现的功能。你不但可以从XML中获得参数,你还可以在由XML创建的DOM文档运行查询语句,完成几个存储过程调用。我将给出一些例子来说明怎样做,每个例子都有一个简单的解释。

在这个例子中,我将传递一些参数用以更新Customer表的name域。XML被解析以获得customerid(标识列)和新的name。我传给过程的XML 字符串如下:
<root><Customer><customerid>3</customerid><name>Acme
Inc.</name></Customer></root>
创建的存储过程如下:
CREATE PROCEDURE update_Customer (@xmldata varchar(8000)) AS
DECLARE @customerid int
DECLARE @customername varchar(50)
DECLARE @xmldata_id int

EXEC sp_xml_preparedocument @xmldata_id OUTPUT, @xmldata, '

SELECT @customerid = customerid, @customername = [name] FROM
OPENXML(@xmldata_id, '//Customer', 2) WITH (customerid int, [name]
varchar(50))

EXEC sp_xml_removedocument @xmldata_id

UPDATE Customer SET Customer.[name] = ISNULL(@customername, Customer.[name])
WHERE Customer.tblID = @customerid

这个过程首先声明我们用于存储相关信息的变量。之后,打开DOM文档,调用过程 sp_xml_preparedocument,其第一个参数返回一个“句柄”。

这个过程调用的第二个参数是新DOM文档的XML源。第一个参数返回的“句柄”在OPENXML调用中用于查询DOM文档。OPENXML调用的第二个参数是一个映射到包含要提取数据的父节点的扩展路径。

第三个参数(2)指明使用以元素为中心的映射。WITH子句为被解析的数据提供行集合格式,然后 sp_xml_removedocument调用删除DOM文档资源。

在下面的另一个例子中,我将会根据传入的一组customer ID删除几行数据。使用的XML 字符串如下:
<root><Customer><customerid>1</customerid></Customer><Customer><customerid>
2</customerid></Customer><Customer><customerid>3</customerid></Customer>
</root>

使用的存储过程如下:
. . .
EXEC sp_xml_preparedocument @xml_id OUTPUT, @xmldata, '
DELETE FROM Customer WHERE Customer.tblID IN (SELECT customerid FROM
OPENXML (@xmldata_id, '//Customer', 2) WITH (customerid int))
. . .

这个存储过程的使用避免了建立一个长SQL查询 字符串来通过ADO传递,或者多次调用同一个存储过程。也避免了由于多次调用引起的 网络拥挤。
正如你看到的,使用Microsoft SQL Server 2000可以使一些事情变得比较简单。但记住是当你在SQL Server 2000中使用XML时,作为参数传入的XML不能超过8000个 字符。就像常说的,不要过高的看待一件好事的好处。
参考MSDN库取得更多关于 OPENXML, sp_xml_preparedocumentsp_xml_removedocument 的信息。  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值