【轉】SQL FOR XML簡介及用法

摘要:sql中的for xml語法爲錶轉化爲xml提供了很好的支持,固然使用一樣的程序語言也可以達到一樣的效果,可是有了for xml將使得這一切更加的方便。sql

主要內容:

Select 的查詢結果會做爲行集返回,可是你一樣能夠在sql中指定for xml子句使得查詢做爲xml來檢索。在for xml子句中,能夠指定如下模式之一:RAW 、AUTO、EXPLICIT和PATH。this

RAW模式返回行爲元素,每一列的值做爲元素的屬性;AUTO模式返回表名爲節點的元素,每一列的屬性做爲屬性輸出;EXPLICIT模式經過SELECT語法定義輸出XML結構;PATH模式中列名或列別名做爲XPATH表達式來處理。spa

下面是四種方式輸出的效果code

RAW模式xml

 

複製代碼
SELECT TOP 5 ProductName,UnitPrice FROM dbo.Products FOR XML RAW
複製代碼

查詢結果blog

複製代碼
<row ProductName="Chai" UnitPrice="18.0000" /> <row ProductName="Chang" UnitPrice="19.0000" /> <row ProductName="Aniseed Syrup" UnitPrice="10.0000" /> <row ProductName="Chef Anton's Cajun Seasoning" UnitPrice="22.0000" /> <row ProductName="Chef Anton's Gumbo Mix" UnitPrice="21.3500" />
複製代碼

 

AUTO模式element

 

複製代碼
SELECT TOP 5 ProductName,UnitPrice FROM dbo.Products FOR XML AUTO
複製代碼

查詢結果文檔

複製代碼
<dbo.Products ProductName="Chai" UnitPrice="18.0000" /> <dbo.Products ProductName="Chang" UnitPrice="19.0000" /> <dbo.Products ProductName="Aniseed Syrup" UnitPrice="10.0000" /> <dbo.Products ProductName="Chef Anton's Cajun Seasoning" UnitPrice="22.0000" /> <dbo.Products ProductName="Chef Anton's Gumbo Mix" UnitPrice="21.3500" />
複製代碼

 

EXPLICIT模式字符串

 

複製代碼
SELECT TOP 5 1 AS Tag,0 AS Parent, OrderID AS [Order!1!ID],OrderDate AS [Order!1!Date],CustomerID AS [Order!1!Customer],NULL AS [OrderDetail!2!ProductID],NULL AS [OrderDetail!2!UnitPrice],NULL AS [OrderDetail!2!Quantity] FROM dbo.Orders WHERE dbo.Orders.OrderID='10248' UNION ALL SELECT TOP 5 2 AS Tag,1 AS Parent, NULL,NULL ,NULL,ProductID,UnitPrice,Quantity FROM dbo.[Order Details] WHERE OrderID='10248'  FOR XML EXPLICIT
複製代碼

查詢結果產品

複製代碼
<Order ID="10248" Date="1996-07-04T00:00:00" Customer="VINET">   <OrderDetail ProductID="11" UnitPrice="14.0000" Quantity="12" />   <OrderDetail ProductID="42" UnitPrice="9.8000" Quantity="10" />   <OrderDetail ProductID="72" UnitPrice="34.8000" Quantity="5" /> </Order>
複製代碼

 

PATH模式

 

複製代碼
SELECT TOP 5 ProductName AS Name, UnitPrice AS Price FROM dbo.Products FOR XML PATH('Cmj')
複製代碼

查詢結果

複製代碼
<Cmj>   <Name>Chai</Name>   <Price>18.0000</Price> </Cmj> <Cmj>   <Name>Chang</Name>   <Price>19.0000</Price> </Cmj> <Cmj>   <Name>Aniseed Syrup</Name>   <Price>10.0000</Price> </Cmj> <Cmj>   <Name>Chef Anton's Cajun Seasoning</Name>   <Price>22.0000</Price> </Cmj> <Cmj>   <Name>Chef Anton's Gumbo Mix</Name>   <Price>21.3500</Price> </Cmj>
複製代碼

 

RAW模式和AUTO模式相對比較簡單,靈活性固然也是比較差的。EXPLICIT模式會將查詢執行生成的行集轉換爲XML文檔,也就是說結構能夠自定義,固然這必須符合必定的格式。就拿上面的語句來講:

Tag指定生成節點的嵌套級別,列名必須爲"Tag"例如上面的級別爲1。

Parent指定當前Tag的父級層次,列名必須爲"Parent",NULL表示頂級。

其餘列名,例如[Order!1!ID]分別表明元素名稱、Tag標記(也就是層級)、屬性名稱。例如上面的這一列就表明會在第一級節點中生成一個節點名稱爲Order的節點而且有一個屬性ID。

此外還須要指出的是這個列名還有一個可選部分,完整的形式是[ElementName!TagNumber!AttributeName!Directive],最後一部分Directive是可選的,若是不指定的話默認做爲ElementName中的屬性名稱;固然若是制定了xml、cdata或者element那麼它將做爲ElementName的一個子元素而不是屬性。而且指定了此選項以後AttributeName能夠爲空。

上面的例子中若是去掉For XML EXPLICIT以後查詢到的數據時以下形式:

 sqlFORXML

按照上面的規則不難看出,FOR XML EXPLICIT會按照順序生成xml:

第一次執行(第一行數據)時tag爲1,parent爲0,則此時會按照列名建立一個Order節點,並依次建立三個屬性:ID、Date和Customer,其值爲:1024八、1996-07-04 00:00:00.000、VINET。此時不會生成ProductID屬性,由於它的Tag爲2,須要在第二級節點中建立,其餘另個屬性也是如此。

第二次執行(第二行數據)時Tag爲2,Parent爲1,也就是要在Tag爲1的節點中建立一個2級節點。而後根據查找列名中Tag爲2的列,依次建立ProductID、UnitPrice、Quantity屬性,並賦值。

第三次、第四次同第二次執行相似,不一樣的只是數據而已。

PATH模式應該說是使用率至關高的,緣由比較簡單,它的使用既簡單又靈活。在PATH模式中,節點名稱可使列名也能夠經過別名指定又或者根本不指定,不指定的狀況下就只顯示節點內數據;根節點能夠指定也能夠不指定,不指定狀況下默認爲"row",而且根節點指定爲""的狀況下能夠徹底取消根節點的顯示。有了這一屬性就可使用PATH模式完成不少有用的操做。

沒有指定根節點時:

複製代碼
SELECT TOP 5 ProductName FROM dbo.Products FOR XML PATH
複製代碼

 

複製代碼
<row>   <Name>Chai</Name>   <Price>18.0000</Price> </row> <row>   <Name>Chang</Name>   <Price>19.0000</Price> </row> <row>   <Name>Aniseed Syrup</Name>   <Price>10.0000</Price> </row> <row>   <Name>Chef Anton's Cajun Seasoning</Name>   <Price>22.0000</Price> </row> <row>   <Name>Chef Anton's Gumbo Mix</Name>   <Price>21.3500</Price> </row>
複製代碼

 

去掉根節點名稱:

複製代碼
SELECT TOP 5 ProductName FROM dbo.Products FOR XML PATH('')
複製代碼

 

複製代碼
<ProductName>Alice Mutton</ProductName> <ProductName>Aniseed Syrup</ProductName> <ProductName>Boston Crab Meat</ProductName> <ProductName>Camembert Pierrot</ProductName> <ProductName>Carnarvon Tigers</ProductName>
複製代碼

 

去掉根節點和子節點名稱:

複製代碼
SELECT TOP 5 ProductName+'' FROM dbo.Products FOR XML PATH('')
複製代碼

 

複製代碼
Alice MuttonAniseed SyrupBoston Crab MeatCamembert PierrotCarnarvon Tigers
複製代碼

 

能夠發現去掉節點名稱以後for xml path起到了字符串鏈接的做用,這樣一來就能夠利用這一特性完成字符串拼接,例以下面的語句就能完成能夠將五種產品用","進行分割的功能:

複製代碼
SELECT LEFT(ProductNames,(LEN(ProductNames)-1)) FROM( SELECT  (SELECT TOP 5 ProductName+',' FROM dbo.Products FOR XML PATH('')) AS ProductNames  ) AS T
複製代碼
相關文章
相關標籤/搜索