用XML和SQL2000來管理存儲過程調用

創建多個帶有不同參數的存儲過程(stored procedure)來完成同一個任務總是一個很大的負擔。利用XML字符串向你的存儲過程發送參數就能夠簡化這個任務;這也讓COM組件的設計更簡單。

實現這個目的的方法是將你的參數作爲一個XML字符串來傳遞,並剖析XML來取回你所需要的數據,然後繼續實現你所需要集成的功能。你不僅可以通過XML來獲取一些參數,你還可以對XML所創建的DOM文檔運行查詢,以此來封裝多個存儲過程。我會提供一些例子,告訴你如果實現這個目的,並簡要地描述每個例子。

在本例裏,爲了更新一個Customer表格裏的姓名字段,我會傳遞幾個參數。爲了獲得customerid(身份列)和新的姓名字段,XML會被剖析。我傳遞給過程的XML字串就像下面的這樣:

<root><Customer><customerid>3</customerid><name>AcmeInc.</name></Customer></root>

要被創建的存儲字段就像下面的這樣:

CREATE PROCEDURE update_Customer (@xmldatavarchar(8000)) ASDECLARE @customeridintDECLARE @customernamevarchar(50)DECLARE @xmldata_idintEXEC sp_xml_preparedocument @xmldata_id OUTPUT, @xmldata, ''SELECT @customerid = customerid, @customername = [name] FROMOPENXML(@xmldata_id, '//Customer', 2) WITH (customeridint, [name]varchar(50))EXEC sp_xml_removedocument @xmldata_idUPDATE Customer SET Customer.[name] = ISNULL(@customername, Customer.[name])WHERE Customer.tblID = @customerid

這個過程首先就聲明我們將要用到的變量會保存相關信息。在此之後,DOM文檔被打開,一個“句柄(handle)”會被返回到sp_xml_preparedocument調用的第一參數裏。

這個調用的第二個參數是用于新DOM文檔的XML源文件。這個“句柄”是在進行OPENXML調用的時候用來從DOM裏查詢信息的。OPENXML調用的第二個參數是父節點的一個Xpath映射,這些父節點包含有要被執行的數據。

第三個參數(2)指明,以元素爲中心的映射會被使用。WITH子句爲被剖析的數據提供了數據列集(rowset)格式,sp_xml_removedocument調用會刪掉DOM文檔的源文件。

在下面這個例子裏,我會傳遞一系列用戶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 FROMOPENXML(@xmldata_id, '//Customer', 2) WITH (customeridint)). . .

有了這個存儲過程就不再需要創建一個冗長的SQL查詢字符串,用以在ADO裏傳遞或者多次調用一個存儲過程了。這也會消除多次調用對網絡流量所造成的影響。

正如你能夠看到的,微軟的SQL 2000讓整個過程稍稍簡單了一點。要記住,這一方法的不足之處在于:在SQL 2000進行XML任務的時候,將XML作爲一個參數發送會被限制到8,000字符。和以往一樣,不要忽視了精心策劃的好處。

訪問MSDN庫能夠獲得更多關于OPENXML、sp_xml_preparedocument以及sp_xml_removedocument的信息。

 
如何使用Ruby腳本調用Oracle存儲過程
使用Ruby腳本調用Oracle存儲過程的示例: 1.首先創建Oracle存儲過程test: SQL> CREATE OR REPLACE PROCEDURE test(p1 in varchar2,p2 out varchar2 ) is2 BEGIN3 select p1||' PROCEDURE EXECUTED!' into p...查看完整版>>如何使用Ruby腳本調用Oracle存儲過程
 
Oracle開發之ASP調用oracle存儲過程
  <!--#include file="inc\public.ASP"--  <!--#include file="inc\conn.asp"--    <Html  <head  <meta http-equiv="Content-Type" content="text/html; charset=gb2312"  <title&...查看完整版>>Oracle開發之ASP調用oracle存儲過程
 
VFP中調用Oracle的存儲過程
  VFP由于其通俗、易用,深受廣大開發人員的歡迎,但其安全性與穩定性卻不十分完善。而Oracle在此方面的優點是有口皆碑的,兩者結合,能開發出高效、安全和穩定的應用系統。有關在VFP中調用Oracle存儲過程方法的資...查看完整版>>VFP中調用Oracle的存儲過程
 
在.NET中調用Oracle9i存儲過程經驗總結
  在.NET中調用Oracle9i存儲過程可以用多個數據提供者,比如OralceClient,OleDb。本文將用OralceClient爲例。.NET語言用C#。 一、調用一個帶輸入、輸出參數的存儲過程首先,在Oralce中創建存儲過程如下: ...查看完整版>>在.NET中調用Oracle9i存儲過程經驗總結
 
Java中調用SQL Server存儲過程示例
  最近做了個Java的小項目(第一次寫Java的項目哦), 到網上搜索了半天,找到了一個比較好點的調用存儲過程的例子,而且網上普遍采用的都是setXXX((int parameterIndex, XXX x)的形式。這種形式感覺不是很直觀,下...查看完整版>>Java中調用SQL Server存儲過程示例