sql server的for xml path與變通的行轉列

SQL Server中有提供一個FOR XML PATH的子句(不知道能不能叫函數),用來將查詢結果行輸出成XML格式,咱們能夠經過這個語法作一些變通實現一些特定的功能,好比說行轉列。要會變通的話,固然首先是要知道FOR XML PATH的語法。數據庫

FOR XML PATH的簡單語法函數

假設有一個hobby表(愛好),表中有兩個字段,一個是hobbyID(愛好id),一個是hName(愛好名稱)。spa

這樣,咱們執行一條最簡單的帶FOR XML PATH子句的SQL語句,看看查詢出來的結果。3d

SELECT * FROM hobby FOR XML PATH;
<row>
  <hobbyID>1</hobbyID>
  <hName>登山</hName>
</row>
<row>
  <hobbyID>2</hobbyID>
  <hName>游泳</hName>
</row>
<row>
  <hobbyID>3</hobbyID>
  <hName>美食</hName>
</row>

由結果可見FOR XML PATH子句能夠將查詢結果行輸出成XML格式。code

FOR XML PATH的變通對象

更多的,FOR XML PATH子句是支持傳遞參數的,即FOR XML PATH(schema),這樣的話在查詢的時候就會將行標籤<row>替換爲<schema>,要注意的是schema必須是字符串。blog

SELECT * FROM hobby FOR XML PATH('yanggb');
<yanggb>
  <hobbyID>1</hobbyID>
  <hName>登山</hName>
</yanggb>
<yanggb>
  <hobbyID>2</hobbyID>
  <hName>游泳</hName>
</yanggb>
<yanggb>
  <hobbyID>3</hobbyID>
  <hName>美食</hName>
</yanggb>

這時候,就能夠利用XML的特色,即空標籤不會存在的特定,將行標籤<row>去掉。字符串

SELECT * FROM hobby FOR XML PATH('');
<hobbyID>1</hobbyID>
<hName>登山</hName>
<hobbyID>2</hobbyID>
<hName>游泳</hName>
<hobbyID>3</hobbyID>
<hName>美食</hName>

那能更改/去除行標籤<row>,能不能更改/去除列標籤呢?答案是能夠的,能夠經過給列起別名的方式來更改/除列標籤。要注意的是這裏的別名也必須是字符串。class

SELECT hobbID AS AA, hName AS BB FROM hobby FOR XML PATH('');
<AA>1</AA>
<BB>登山</BB>
<AA>2</AA>
<BB>游泳</BB>
<AA>3</AA>
<BB>美食</BB>

與去除行標籤<row>的方式不同的是,去除列標籤不能將別名定義爲空字符串,不然數據庫引擎會報錯誤:[Err] 42000 - [SQL Server]缺乏對象或列名,或者對象或列名爲空。對於 SELECT INTO 語句,請確保每列均具備名稱。對於其餘語句,請查找空的別名。不容許使用定義爲 "" 或 [] 的別名。請將別名更改成有效名稱。語法

那麼要怎麼去除列標籤呢,作法是給字段加上空字符串(加任何字符串均可以,個人理解是這種作法修改了列值,在沒有起別名的狀況下,原來的列標籤再也不匹配列值,數據庫引擎會將自動該列標籤去除)。

SELECT hobbID + '', hName + '' FROM hobby FOR XML PATH('');
1登山2游泳3美食

FOR XML PATH實現行轉列

根據上面的FOR XML PATH的變通的內容,咱們就能夠來實現行轉列了。

SELECT
    hName, 
    (SELECT ',' + hName FROM hobby FOR XML PATH('')) AS hNames
FROM hobby FOR XML PATH('');

這樣咱們就能獲得一個全部愛好拼接起來的列hNames。

這時候咱們會發現hNames字段值多了一個逗號,使用STUFF函數(推薦)或REPLACE函數去除便可。

更多的,能夠在FOR XML PATH子句前添加WHERE子句限定條件範圍來限定行轉列的範圍(也可使用自鏈接限定當前行轉列的範圍)。

固然了,SQL SERVER還提供了另外的行轉列的Privot函數和列轉行的UNPRIVOT函數。

 

"一個姑娘不會由於你專注癡情就喜歡你,只會由於你優秀而喜歡你。"

相關文章
相關標籤/搜索