用XML和SQL 2000來管理儲存過程呼叫(轉)
建立多個帶有不同引數的儲存過程(stored procedure)來完成同一個任務總是一個很大的負擔。利用XML字串向你的儲存過程傳送引數就能夠簡化這個任務;這也讓COM元件的設計更簡單。
實現這個目的的方法是將你的引數作為一個XML字串來傳遞,並剖析XML來取回你所需要的資料,然後繼續實現你所需要整合的功能。你不僅可以透過XML來獲取一些引數,你還可以對XML所建立的DOM文件執行查詢,以此來封裝多個儲存過程。我會提供一些例子,告訴你如果實現這個目的,並簡要地描述每個例子。
在本例裡,為了更新一個Customer表格裡的姓名欄位,我會傳遞幾個引數。為了獲得customerid(身份列)和新的姓名欄位,XML會被剖析。我傳遞給過程的XML字串就像下面的這樣:
要被建立的儲存欄位就像下面的這樣:
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字串的內容:
相應的儲存過程看起來就像下面這樣:. . .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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQL 儲存過程裡呼叫另一個儲存過程SQL儲存過程
- 用PHP呼叫MySQL儲存過程PHPMySql儲存過程
- 用java呼叫oracle儲存過程JavaOracle儲存過程
- 呼叫儲存過程儲存過程
- 在 SQL Server 的儲存過程中呼叫 Com 元件 (轉)SQLServer儲存過程元件
- 使用ADO呼叫儲存過程 (轉)儲存過程
- SQL 2000 2005通用儲存過程SQL儲存過程
- mybatis呼叫檢視和儲存過程MyBatis儲存過程
- Winform呼叫儲存過程ORM儲存過程
- perl呼叫儲存過程儲存過程
- jdbc呼叫儲存過程JDBC儲存過程
- Java呼叫SQL Server的儲存過程詳解JavaSQLServer儲存過程
- php呼叫mysql儲存過程和函式的方法(轉)PHPMySql儲存過程函式
- 用java呼叫oracle儲存過程總結JavaOracle儲存過程
- SQL分隔字串的儲存過程 (轉)SQL字串儲存過程
- 兩種SQL分頁方法儲存過程和遊標儲存過程SQL儲存過程
- 管理儲存過程儲存過程
- 用.NET呼叫oracle的儲存過程返回記錄集 (轉)Oracle儲存過程
- SQL Server 儲存過程的運用SQLServer儲存過程
- mysql如何呼叫儲存過程MySql儲存過程
- linux呼叫儲存過程Linux儲存過程
- PB中呼叫儲存過程儲存過程
- java 呼叫oracle 儲存過程JavaOracle儲存過程
- php呼叫mssql儲存過程PHPSQL儲存過程
- java中呼叫儲存過程Java儲存過程
- 生成sql server2000物件建立指令碼的儲存過程(轉)SQLServer物件指令碼儲存過程
- 在儲存過程A中呼叫儲存過程B的結果儲存過程
- SQL儲存過程示例SQL儲存過程
- SQL Server 儲存過程SQLServer儲存過程
- 【SQL Server】--儲存過程SQLServer儲存過程
- SQL Server 2000 的分頁查詢(儲存過程)SQLServer儲存過程
- 由Delphi程式改寫Sql(2000)的儲存過程SQL儲存過程
- MYSQL儲存過程管理MySql儲存過程
- jsp中呼叫儲存過程JS儲存過程
- Spring mybatis 呼叫儲存過程SpringMyBatis儲存過程
- c / c + + 呼叫mysql儲存過程MySql儲存過程
- C#呼叫 oracle儲存過程C#Oracle儲存過程
- C#呼叫Oracle儲存過程C#Oracle儲存過程