創(chuàng)建多個帶有不同參數(shù)的存儲過程(stored procedure)來完成同一個任務(wù)總是一個很大的負(fù)擔(dān)。利用XML字符串向你的存儲過程發(fā)送參數(shù)就能夠簡化這個任務(wù);這也讓COM組件的設(shè)計(jì)更簡單。
實(shí)現(xiàn)這個目的的方法是將你的參數(shù)作為一個XML字符串來傳遞,并剖析XML來取回你所需要的數(shù)據(jù),然后繼續(xù)實(shí)現(xiàn)你所需要集成的功能。你不僅可以通過XML來獲取一些參數(shù),你還可以對XML所創(chuàng)建的DOM文檔運(yùn)行查詢,以此來封裝多個存儲過程。我會提供一些例子,告訴你如果實(shí)現(xiàn)這個目的,并簡要地描述每個例子。
在本例里,為了更新一個Customer表格里的姓名字段,我會傳遞幾個參數(shù)。為了獲得customerid(身份列)和新的姓名字段,XML會被剖析。我傳遞給過程的XML字串就像下面的這樣:
root>Customer>customerid>3/customerid>name>Acme
Inc./name>/Customer>/root>
要被創(chuàng)建的存儲字段就像下面的這樣:
CREATE PROCEDURE update_Customer (@xmldatavarchar(8000)) AS
DECLARE @customeridint
DECLARE @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
這個過程首先就聲明我們將要用到的變量會保存相關(guān)信息。在此之后,DOM文檔被打開,一個“句柄(handle)”會被返回到sp_xml_preparedocument調(diào)用的第一參數(shù)里。
這個調(diào)用的第二個參數(shù)是用于新DOM文檔的XML源文件。這個“句柄”是在進(jìn)行OPENXML調(diào)用的時候用來從DOM里查詢信息的。OPENXML調(diào)用的第二個參數(shù)是父節(jié)點(diǎn)的一個Xpath映射,這些父節(jié)點(diǎn)包含有要被執(zhí)行的數(shù)據(jù)。
第三個參數(shù)(2)指明,以元素為中心的映射會被使用。WITH子句為被剖析的數(shù)據(jù)提供了數(shù)據(jù)列集(rowset)格式,sp_xml_removedocument調(diào)用會刪掉DOM文檔的源文件。
在下面這個例子里,我會傳遞一系列用戶ID,用以刪除多個數(shù)據(jù)列。下面就是XML字符串的內(nèi)容:
root>Customer>customerid>1/customerid>/Customer>Customer>customerid>
2/customerid>/Customer>Customer>customerid>3/customerid>/Customer>
/root>
相應(yīng)的存儲過程看起來就像下面這樣:
. . .
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))
. . .
有了這個存儲過程就不再需要創(chuàng)建一個冗長的SQL查詢字符串,用以在ADO里傳遞或者多次調(diào)用一個存儲過程了。這也會消除多次調(diào)用對網(wǎng)絡(luò)流量所造成的影響。
正如你能夠看到的,微軟的SQL 2000讓整個過程稍稍簡單了一點(diǎn)。要記住,這一方法的不足之處在于:在SQL 2000進(jìn)行XML任務(wù)的時候,將XML作為一個參數(shù)發(fā)送會被限制到8,000字符。和以往一樣,不要忽視了精心策劃的好處。
訪問MSDN庫能夠獲得更多關(guān)于OPENXML、sp_xml_preparedocument以及sp_xml_removedocument的信息。