創建幾個帶不同參數的存儲過程去完成同一樣任務對我們來說一直以來都是一個負擔。通過使用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 的信息。
|