SQL Server2000的OpenXML特性 SQL Server2000提供了OpenXML特性,我們可以很方便的用OpenXML特性來代替?zhèn)鹘y(tǒng)的行集結(jié)果,同樣我們也可以使用定義好的XML文檔作為輸入的數(shù)據(jù),這樣也為我們的數(shù)據(jù)移植帶來的巨大的便利。 同時,SQL Server2000中也提供了存儲過程,用微軟的話說,只有設(shè)計成存儲過程,才算是”cleaner separation of code from the middle-tier”,這樣做是很好的。應(yīng)用程序訪問數(shù)據(jù)庫的數(shù)據(jù)并不是直接的與數(shù)據(jù)庫表打交道,而是通過存儲過程的運行來獲取所需要的數(shù)據(jù)。這樣的設(shè)計有一個好處就是,避免了頻繁的表操作,而通過運行在服務(wù)器端的存儲過程可以極大的提高運作效率和提升訪問數(shù)據(jù)的速度,同時也很好的屏蔽了數(shù)據(jù)庫表的邏輯,使得數(shù)據(jù)庫訪問變成了數(shù)據(jù)庫提供的服務(wù)訪問。 既然OpenXML和存儲過程都可以提高SQL Server2000的性能,那么能否把這種技術(shù)結(jié)合起來了?答案是肯定的,下面我們就來看看怎么在存儲過程中使用OpenXML. 以下是一個使用了OpenXML特性的存儲過程: ******************************************************************************* ------------------------------------------------------------------------------- -- upArchiveMsgInsertMsg ------------------------------------------------------------------------------- /****************************************************************************** 這是一個公文消息xml文檔的實例 declare @xml varchar(8000) SET @xml=‘ <> Title="jiangsuer" UserID="Admin" Author="湖北" SendTime=" AttachFile="hust" ReceiveList="younther" Body="hustwelcome"> ‘ exec upArchiveMsgInsertMsg @xml *******************************************************************************/ //這個運行存儲過程先在ArchiveMsg表中插入一條公文信息,并根據(jù)該條公文信息的MsgID和接受者列表,再在MsgList表插入每個接受者的UserID和MsgID,這些信息從xml中獲取。 ALTER PROCEDURE upArchiveMsgInsertMsg ( @xml varchar(8000) ) AS DECLARE @idoc int -- xml doc DECLARE @MsgID int -- new order DECLARE @SendTime datetime -- 解析XML文檔 EXEC sp_xml_preparedocument @idoc output, @xml SET NOCOUNT ON DECLARE @CurrentError int BEGIN TRANSACTION -- 開始更新數(shù)據(jù)的事務(wù) SELECT @SendTime=SendTime FROM OpenXML(@idoc, ‘/ArchiveMsg‘) WITH ArchiveMsg INSERT INTO ArchiveMsg(Title,UserID,Author,SendTime,Department,ReceiveList,Body,AttachFile) SELECT Title,UserID,Author,SendTime,Department,ReceiveList,Body,AttachFile FROM OpenXML(@idoc, ‘/ArchiveMsg‘) WITH ArchiveMsg -- 錯誤檢查 SELECT @CurrentError = @@Error IF @CurrentError != 0 BEGIN GOTO ERROR_HANDLER END SELECT @MsgID=@@IDENTITY INSERT INTO MsgList(MsgID,UserID,SendTime) SELECT @MsgID,UserID,@SendTime FROM OpenXML(@idoc, ‘/ArchiveMsg/MsgList‘) WITH ( MsgID int, UserID varchar(80), SendTime datetime ) -- 錯誤檢查 SELECT @CurrentError = @@Error IF @CurrentError != 0 BEGIN GOTO ERROR_HANDLER END -- 事務(wù)結(jié)束 COMMIT TRANSACTION SET NOCOUNT OFF -- 從內(nèi)存中移除定義的XML文檔 EXEC sp_xml_removedocument @idoc RETURN 0 ERROR_HANDLER: ROLLBACK TRANSACTION SET NOCOUNT OFF -- 從內(nèi)存中移除定義的XML文檔 EXEC sp_xml_removedocument @idoc RETURN @CurrentError ******************************************************************************* 好了,存儲過程就是這樣了,我們得測試這個存儲過程,測試函數(shù)代碼如下: 首先我們得生成這個XML文檔,為了簡便起見,我們就用一個String變量來摸擬XML文檔: public string GetXmlString(ArchiveDetail myMsg,string[] useridList) { string xml=""; xml+=" xml+="UserID=\""+myMsg.UserID+"\" "; xml+="Author=\""+myMsg.Author+"\" "; xml+="SendTime=\""+myMsg.SendTime.ToString()+"\" "; xml+="Department=\""+myMsg.Department+"\" "; xml+="AttachFile=\""+myMsg.AttachFilepath+"\" "; xml+="ReceiveList=\""+myMsg.ReceiveList+"\" "; xml+="Body=\""+myMsg.Body+"\">"; foreach(string i in useridList) { xml+=" } xml+=""; return xml; } 然后就是調(diào)用這個存儲過程的函數(shù): public bool SendArchiveMsg(ArchiveDetail myMsg,string[] useridList) { string xml=this.GetXmlString(myMsg,useridList); try { SqlParameter[] prams={ data.MakeInParam("@xml",SqlDbType.VarChar,8000,xml) }; SqlConnection con = new