建立多個具有不同參數的預存程序(stored PRocedure)來完成同一個任務總是一個很大的負擔。利用xml字串向你的預存程序發送參數就能夠簡化這個任務;這也讓COM元件的設計更簡單。
實現這個目的的方法是將你的參數作為一個XML字串來傳遞,並剖析XML來取回你所需要的數據,然後繼續實現你所需要整合的功能。你不僅可以透過XML來取得一些參數,還可以對XML所建立的DOM文件執行查詢,以此來封裝多個預存程序。我會提供一些例子,告訴你如果實現這個目的,並簡要地描述每個例子。
在本例裡,為了更新一個Customer表格裡的姓名字段,我會傳遞幾個參數。為了獲得customerid(身份列)和新的姓名字段,XML會被剖析。我傳遞給過程的XML字串就像下面的:
<root><Customer><customerid>3</customerid><name>Acme Inc.</name></Customer></root>
要被建立的儲存欄位就像下面的一樣:
CREATE PROCEDURE update_Customer (@xmldatavarchar(8000)) ASDECLARE @customeridintDECLARE @customernamevarchar(50)DECLARE @xmldata_idint EXEC sp_xml_preparedocument @xmldata_id OUTPUT, @xmldata, '' SELECT @customerid = customerid, @customername = [name] FROM OPENXML(@xmldata_id, '//Customer', 2) WITH (customeridint, [name] varchar(50)) EXEC sp_xml_removedocument @xmldata_id UPDATE 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 FROM OPENXML(@xmldata_id, '//Customer', 2) WITH (customeridint)) . . .
有了這個預存程序就不再需要建立一個冗長的SQL查詢字串,用以在ADO裡傳遞或多次呼叫一個預存程序了。這也會消除多次呼叫對網路流量所造成的影響。
如你所能看到的,微軟的SQL 2000讓整個過程稍微簡單了一點。要記住,這個方法的缺點在於:在SQL 2000進行XML任務的時候,將XML作為一個參數發送會被限製到8,000字元。和以往一樣,不要忽視了精心策劃的好處。
存取MSDN函式庫能夠獲得更多關於OPENXML、sp_xml_preparedocument以及sp_xml_removedocument的資訊。
以上就是用XML和SQL 2000來管理預存程序呼叫的內容,更多相關內容請關注PHP中文網(m.sbmmt.com)!