在本文中我們將討論如何通過T-SQL的FOR XML子句從SQL Server返回XML。本文將通過幾個例子來介紹返回XML數據和架構信息的幾種不同方式,還將介紹將XML轉換成更令人滿意的格式的方法。然後討論OPENXML,以及將XML文檔聯接到數據庫表和使用WriteXml和GetXml方法從數據集提取XML的方法。
SQL Server 2000提供了一些XML功能,用於通過XML將關系行集合轉換成分層的XML文檔、讀取XML文檔和批量加載數據。例如,可以將XML文檔傳遞到存儲過程,將XML聯接到某些表並返回一個行集合,甚至可以在數據庫中修改數據。XML在當今企業系統中不斷擴展的功能促進了OPENXML函數和FOR XML語句的引入。其中某些功能不但支持XML,而且還提高批量加載數據時的性能。
在本文中我們將討論如何通過T-SQL的FOR XML子句從SQL Server返回XML。本文將通過幾個例子來介紹返回XML數據和架構信息的幾種不同方式,還將介紹將XML轉換成更令人滿意的格式的方法。然後討論OPENXML,以及將XML文檔聯接到數據庫表和使用WriteXml和GetXml方法從數據集提取XML的方法。這些例子的SQL,以及執行其中某些例子並將它們導出為文本文件的示例ASP.NET 項目,都可從MSDN Magazine Web站點下載。該示例項目中還包含了用於從XML將記錄插入和更新到數據庫的代碼。
返回XML
當用於SELECT語句中時,FOR XML子句指示SQL Server將數據作為XML返回,這與標准行集合相反。可以指定返回模式:RAW、AUTO或EXPLICIT。每種模式都提供了XML的不同轉換方式(圖 1 給出了各種模式的概述)。
圖 1 FOR XML模式概述
模式 說明 RAW 行集合的每個記錄都轉換成叫做行的XML元素。<row>元素將包含一個屬性,用來表示所檢索的列。 AUTO 行集合記錄可以轉換成以FROM子句中的表命名的嵌套XML元素。所檢索每一列都將表示為一個屬性 EXPLICIT 為格式化XML提供許多控制。不過,EXPLICIT模式的使用語法要復雜得多。XSLT是一個比較常用的XML轉換方法。例如,若使用FOR XML RAW來查詢Northwind數據庫的Employees表,它會在<row>元素中返回每個員工行。SELECT語句中包含的每一列都會表示為<row>元素的一個屬性。下面的FOR XML RAW查詢選擇兩個員工記錄,然後以RAW格式返回:
SELECT EmployeeID,
FirstName, LastName
FROM Employees
WHERE LastName LIKE 'D%'
FOR XML RAW
<row EmployeeID="1" FirstName="Nancy" LastName="Davolio"/>
<row EmployeeID="9" FirstName="Anne" LastName="Dodsworth"/>
對該SELECT語句作一下修改就可以使用FOR XML AUTO子句。這次將元素命名為Employees,與源表的名稱匹配。列仍是主元素的屬性:
SELECT EmployeeID, FirstName, LastName
FROM Employees
WHERE LastName LIKE 'D%'
FOR XML AUTO
<Employees EmployeeID="1" FirstName="Nancy" LastName="Davolio"/>
<Employees EmployeeID="9" FirstName="Anne" LastName="Dodsworth"/>