创建几个带不同参数的存储过程去完成同一样任务对我们来说一直以来都是一个负担。通过使用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_preparedocument 和 sp_xml_removedocument 的信息。
|