FOR XML PATH 方法是用於將查詢結果集以XML形式展示,這樣展示方式的好處不言而喻。現在我要介紹的FOR XML PATH的“另類”用法。
首先,我們先來看看它的正常用法。下圖是我們用到的一張TEST_PERSON表:
用FOR XML PATH方法查詢,SQL語句如下:
SELECT * FROM TEST_PERSON FOR XML PATH
顯示結果如下:
展開結果可以看到如下圖:
神奇吧!!!!細心的同學會注意到這個XML文件的行節點是<row>,如果需求需要改變這個行節點為<animal>,怎么改?看下面的SQL語句你就會知道了。
SELECT * FROM TEST_PERSON FOR XML PATH('animal')
展開結果如下圖:
簡單吧!!!有野心的同學就會說了:既然行節點可以改變,那列節點要改變又該怎么操作呢?很簡單,只要給字段加別名。SQL語句如下:
SELECT ID AS XuHao,NAME AS MyName FROM TEST_PERSON FOR XML PATH('animal')
展開結果如下:
好玩吧!!!古怪的同學就想了:既然行和列都可以自定義,那么是否說我們可以定義我們喜歡的輸出方式呢?!(我們要說的重點就是這)
看如下SQL語句:
SELECT '['+NAME+']' +' 'FROM TEST_PERSON FOR XML PATH('')
展示結果如下:
說了這么多,好像只是為了好玩。那么有哪些實際的應用場景中可以用到這個技術呢?
例如:要查詢一個訂單信息,這些信息包括(訂單號+費用名稱+...),而費用我們是存在單獨的一個子表中,且一個訂單不只一筆費用。
接下來我們增加個動物的行為表TEST_HOBBY表,用演示以上效果。TEST_HOBBY表如下:
我們查動物信息(動物名字+動物行為),動物行為存在TEST_HOBBY表中,我們通過ID 關聯,並且一個動物存在多種行為。SQL語句如下:
SELECT PE.NAME,--取出TEST_PERSON表中的NAME字段 --通過ID關聯到TEST_HOBBY表,並把這表中各種動物的行為拼接為一個字段返回 (SELECT ' '+HO.HOBBY_NAME+' ' FROM TEST_HOBBY HO WHERE HO.PARENT_ID=PE.ID FOR XML PATH('')) AS HOBBY FROM TEST_PERSON PE
結果展示如下:
好玩吧,O(∩_∩)O哈哈~
更多知識可以參考: http://msdn.microsoft.com/zh-cn/library/ms189885.aspx
(今天寫存儲過程時用到了FOR XML PATH方法,所以整理一下FOR XML PATH的知識。)