用XML和SQL 2000來管理儲存過程呼叫(轉)

amyz發表於2007-08-12
用XML和SQL 2000來管理儲存過程呼叫(轉)[@more@]

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

  實現這個目的的方法是將你的引數作為一個XML字串來傳遞,並剖析XML來取回你所需要的資料,然後繼續實現你所需要整合的功能。你不僅可以透過XML來獲取一些引數,你還可以對XML所建立的DOM文件執行查詢,以此來封裝多個儲存過程。我會提供一些例子,告訴你如果實現這個目的,並簡要地描述每個例子。

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

  3Acme Inc.

  要被建立的儲存欄位就像下面的這樣:

  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] FROM OPENXML(@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字串的內容:

  123

  相應的儲存過程看起來就像下面這樣:. . .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的資訊。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-950303/,如需轉載,請註明出處,否則將追究法律責任。

相關文章