熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> SQL Server >> 正文

使SQL Server數據支持 XML

2013-11-15 14:37:45  來源: SQL Server 

  學習如何用SQL Server的XML特征為你的數據庫提供新的功能
  
  如果你在IT業工作那麼你很可能聽說過XML但如果你的工作主要與SQL Server有關那麼你可能並沒有直接運用過XMLXML已經是Web編程環境中的普遍的數據格式了而且它也是NET Framework中主要的底層技術之一SQL Server以兩種方式來支持XML通過SQL Server本身的功能以及通過發布稱為SQLXML的額外的功能SQLXML擴展了SQL Server並提供了XML兼容性在本月的專欄中我將講述SQL Server對XML的內置的支持並講述通過發布SQLXML而增加的一些功能(見 圖SQL Server支持XML就意味著我們可以更有效地更新和讀取數據了我們不再需要將XML數據轉換成數據庫可以理解的另一種格式或將XML數據從數據庫轉換成XML而且可供開發人員選擇的方法也更多了就是說他們在訪問數據方面更靈活了
  對XML的宣傳已經有很多了所以重要的一點是要意識到它只是一門簡單的技術本質上它是用來描述數據的一個標准的文件格式(有關XML基礎知識的更多的信息請參閱工具條XML )從發布SQL Server 的最初版本以來對XML的支持就已經是SQL Server的一部分了SQL Server不是通過提供一個方法保存XML文件來支持XML的而是提供了一個到關系數據的接口使你可以在表和其它數據庫對象中讀寫XML數據SQL Server所固有的XML功能包括可以通過HTTP模板查詢FOR XML子句和OPENXML()函數來訪問SQL Server接下來我將講述這些功能是如何運作的以及它們可以如何使你的企業受益
  
  圖 提供 XML支持
  
  要通過HTTP訪問一個SQL Server數據庫你必須首先設置一個虛擬目錄這個虛擬目錄在HTTP協議和一個特定的數據庫之間提供了一個鏈接設置虛擬目錄時我們需要用Configure SQL XML Support In IIS菜單條目你可以在Window的Start菜單中的SQL Server菜單條目找到該項通過該菜單條目你就可以指定虛擬目錄的名稱物理路徑服務器名稱數據庫名稱和注冊信息一旦你創建了一個虛擬目錄你就可以通過一個URL將查詢發送到數據庫了如果你設置了一個叫做Northwind的虛擬目錄並在浏覽器中輸入了查//localhost/Northwind?sql=SELECT+*+FROM+Shippers+FOR+XML+AUTOELEMENTS+&root=Shippers它就會返回類似於XML 工具條中的Shippers例子中的XML數據與運用ADO或其它任何技術相比HTTP查詢會讓我們更容易地來訪問網站或Web應用程序的數據 對於一個簡單的查詢語句來說HTTP查詢會很好但對於一個更復雜的查詢來說這種格式就會變得難以理解並很難管理了這種方法也不安全因為查詢源代碼是暴露給用戶的另外一種可選方法是在HTTP上調用一個模板查詢一個模板查詢就是一個包含SQL查詢的XML文件模板作為文件保存在服務器上因此如果你在一個叫做GetShippersxml的模板中封裝了Shippers SELECT查詢那麼URL查詢的形式就會是模板也可以帶有參數當你的模板調用一個存儲過程時該功能會很有用在URL查詢和模板查詢中如果你想從查詢返回一個HTML頁面那麼你可以指定一個XSLT樣式表將它用於XML模板查詢是讀取數據的一個更安全的方法它可以被緩存以得到更好的性能
  
  你也可以用FOR XML子句將數據讀取成XML格式該方法從SQL Server表中返回數據你可以把它們看做是XML數據你可以在一個SELECT語句中運用FOR XML子句它有三種模式可以以不同的格式來返回XMLRAWAUTO和EXPLICITRAW模式將結果中的每個記錄作為一個普通的行元素來返回它被包含在一個<row/>標簽中並將每個列的值作為一個屬性AUTO模式將每個記錄作為行元素返回根據源表或視圖對它進行命名如果查詢從一個表返回多個列那麼每個列的值就會被作為表元素的屬性來返回但最重要的是如果你的SELECT語句執行了合並操作那麼AUTO模式就代表的是子行它們作為元素嵌套在父行下EXPLICIT模式有幾個參數你可以通過這些參數完全定義返回的XML的樣式你可以為每個元素定義標簽明確確定數據是如何嵌套的FOR XML語句使我們不必再返回一個rowset然後在客戶端或中間層將它轉換成XML了
  
  OPENXML函數可以讓你像操作一個表那樣來運用XML數據可以將它們轉換成內存中的一個rowset要運用OPENXML首先要調用sp_xml_preparedocument存儲過程實際上它將XML解析成一個數據樹並將那個數據的句柄傳遞到OPENXML函數然後你就可以操作那個數據了進行查詢將它插入到表中等等OPENXML函數可以帶有三個參數用於XML文檔內部顯示的句柄一個rowpattern參數和一個flags參數Rowpattern參數指定了應該返回原始的XML文檔中的哪些節點Flags參數指定了以屬性為中心的映射(結果集中列名符合屬性名)或以元素為中心的映射(結果集中列名符合元素名)在處理完XML數據後我們可以調用sp_xml_removedocument將XML數據從內存中刪除
  通過SQLXML得到更多的支持
  
  通過發布SQLXML(也被稱為Web版)Microsoft也在SQL Server中提供了更多的XML支持已經有三個SQLXML的版本了它們包含的一些額外的功能有updategram和XML Bulk Load你可以在線下載最新的版本SQLXML (見資源)你可以通過基於XML的模板運用updategram來插入更新或刪除表中的數據該模板有一個before block它描述了記錄更新前的當前狀態還有一個after block它描述了記錄的變化下面就是updategram的一個例子它修改了Shippers表中的一個公司的Phone字段
  
  在缺省情況下updategrams認為before block和after block中的字段指的是表和列但updategrams也可以用一個mapping schemaMapping schema將一個XML文檔中的元素與一個表中的元素關聯了起來如果在上面的模板中你引用屬性名SID而不是ShipperID那麼mapping schema就會將SID映射到ShipperID列你可以通過HTTP(同模板查詢一樣)或通過ADO將updategrams發送到SQL Server它們也可以被參數化帶有輸入值Updategrams提供了一個方法使我們可以直接從XML更新SQL Server數據這樣就不用從XML文檔得到數據然後再用一個記錄集或調用一個存儲過程了Updategrams只是可以簡單地插入更新或刪除數據所以如果你需要查看一個值是否存在或在更新前查看一些商業規則那麼你就應該用OPENXML
  
  雖然你可以用OPENXML函數和updategrams來插入數據但對於加載大量的XML數據來說這兩種方法都不實用你應該用XML Bulk Load將大量的XML數據插入到SQL Server表中實際上我們是用SQLXMLBulkLoad組件來加載數據的你可以從一個客戶端應用程序來調用這個組件在建立到數據庫的連接後bulk load組件需要一個路徑來訪問mapping schema從而將XML屬性和元素映射到數據庫對象而且還需要路徑來訪問一個XML文檔或一個XML流在Bulk Load組件中你可以指定是否執行數據表檢查約束(check constraint)是否忽略通過復制鍵添加的記錄當插入數據時是否應該鎖定數據表等等
  
  缺省情況下大量加載不是事務處理型(transactional)的所以如果出現錯誤截止到錯誤點前插入的數據就會保留在數據庫中你可以指定所有加載的數據都是在一個單獨的事務處理過程中的因此該過程要麼會十分成功要麼會回滾如果你用了事務處理所有的數據在插入前都會被寫進一個臨時的文件這就意味著你需要足夠的磁盤空間來保存臨時文件而且加載數據可能會相當慢XML Bulk Load給我們提供了一個很好的方法使我們可以將大量的數據寫到SQL Server中否則你就必須提取數據然後用另外的方法將它加載到你的數據庫中
  
  你也可以配置SQL Server來緩存XSLT樣式表模板和mapping schema從而得到更好的性能根據具體實現情況你可以在Web應用程序中用通過HTTP和XSLT的XML查詢來替代標准的ASP/ADO數據訪問從而得到HTML輸出結果這種方法可以極大地提高性能
  
  以上就是SQL Server對XML的一些高級支持不管我們對它的宣傳有多少XML的功能就這麼多了因為XML是用來顯示數據的一個標准也是用於NET的數據傳輸技術因此XML與SQL Server的集成能力就會是企業需要解決的一個重要的問題

From:http://tw.wingwit.com/Article/program/SQLServer/201311/22082.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.