學習如何用SQL Server的XML特征為你的數據庫提供新的功能
如果你在IT業工作
那麼你很可能聽說過XML
但如果你的工作主要與SQL Server有關
那麼你可能並沒有直接運用過XML
XML已經是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+AUTO
ELEMENTS+&root=Shippers
它就會返回類似於
XML
工具條中的Shippers例子中的XML數據
與運用ADO或其它任何技術相比
HTTP查詢會讓我們更容易地來訪問網站或Web應用程序的數據
對於一個簡單的查詢語句來說
HTTP查詢會很好
但對於一個更復雜的查詢來說
這種格式就會變得難以理解並很難管理了
這種方法也不安全
因為查詢源代碼是暴露給用戶的
另外一種可選方法是在HTTP上調用一個模板查詢
一個模板查詢就是一個包含SQL查詢的XML文件
模板作為文件保存在服務器上
因此
如果你在一個叫做GetShippers
xml的模板中封裝了Shippers SELECT查詢
那麼URL查詢的形式就會是
模板也可以帶有參數
當你的模板調用一個存儲過程時
該功能會很有用
在URL查詢和模板查詢中
如果你想從查詢返回一個HTML頁面
那麼你可以指定一個XSLT樣式表
將它用於XML
模板查詢是讀取數據的一個更安全的方法
它可以被緩存以得到更好的性能
你也可以用FOR XML子句將數據讀取成XML格式
該方法從SQL Server表中返回數據
你可以把它們看做是XML數據
你可以在一個SELECT語句中運用FOR XML子句
它有三種模式可以以不同的格式來返回XML
RAW
AUTO和EXPLICIT
RAW模式將結果中的每個記錄作為一個普通的行元素來返回
它被包含在一個<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 schema
Mapping 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