SQL Server FOR XML PATH 語句的應用—列轉行

來源:互聯網
上載者:User

經常在論壇看到高手使用了 for xml path,由於是搜尋一下,記錄了詳細的使用方法。
在SQL Server中利用 FOR XML PATH 語句能夠把查詢的資料產生XML資料,下面是它的一些應用樣本。

DECLARE @TempTable table(UserID int , UserName nvarchar(50));
insert into @TempTable (UserID,UserName) values (1,'a')
insert into @TempTable (UserID,UserName) values (2,'b')
 
select UserID,UserName from @TempTable FOR XML PATH運行這段指令碼,將產生如下結果:<row>
  <UserID>1</UserID>
  <UserName>a</UserName>
</row>
<row>
  <UserID>2</UserID>
  <UserName>b</UserName>
</row>大家可以看到兩行資料產生了兩個節點,修改一下PATH的參數:select UserID,UserName from @TempTable FOR XML PATH('lzy')再次運行上述指令碼,將產生如下的結果:

<lzy>
  <UserID>1</UserID>
  <UserName>a</UserName>
</lzy>
<lzy>
  <UserID>2</UserID>
  <UserName>b</UserName>
</lzy>可以看到節點變成,其實PATH() 括弧內的參數是控制節點名稱的,這樣的話大家可以看一下如果是Null 字元串(不是沒有參數)會是什麼結果?select UserID,UserName from @TempTable FOR XML PATH('')執行上面這段指令碼將產生結果:

<UserID>1</UserID>
<UserName>a</UserName>
<UserID>2</UserID>
<UserName>b</UserName>這樣就不顯示上級節點了,大家知道在 PATH 模式中,列名或列別名被作為 XPath 運算式來處理,也就是說,是列的名字,這樣大膽實驗一下不給指定列名和別名會是怎麼樣?

select CAST(UserID AS varchar) + '',UserName + '' from @TempTable FOR XML PATH('') 

運行上面這句將產生結果 

1a2b

所有資料都產生一行,而且還沒有串連字元,這樣的資料可能對大家沒有用處,還可以再變化一下:
select CAST(UserID AS varchar) + ',',UserName + '',';' from @TempTable FOR XML PATH('') 
產生結果 
1,a;2,b;
大家現在明白了吧,可以通過控制參數來產生自己想要的結果,例如:  
select '{' + CAST(UserID AS varchar) + ',','"' +UserName + '"','}' from @TempTable FOR XML PATH('') 
產生結果 
{1,"a"}{2,"b"}
還可以產生其他格式,大家可以根據自己需要的格式進行組合。 
下面是一個資料統計的應用,希望大家可以通過下面的執行個體想到更多的應用  
DECLARE @T1 table(UserID int , UserName nvarchar(50),CityName nvarchar(50));
insert into @T1 (UserID,UserName,CityName) values (1,'a','上海')
insert into @T1 (UserID,UserName,CityName) values (2,'b','北京')
insert into @T1 (UserID,UserName,CityName) values (3,'c','上海')
insert into @T1 (UserID,UserName,CityName) values (4,'d','北京')
insert into @T1 (UserID,UserName,CityName) values (5,'e','上海')
 
SELECT B.CityName,LEFT(UserList,LEN(UserList)-1) FROM (
SELECT CityName,
  (SELECT UserName+',' FROM @T1 WHERE CityName=A.CityName FOR XML PATH('')) AS UserList
FROM @T1 A 
GROUP BY CityName
) B 

產生結果(每個城市的使用者名稱) 

北京 b,d
上海 a,c,e

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.