灵活运用 SQL Server 数据库的 FOR XML PATH
生活随笔
收集整理的這篇文章主要介紹了
灵活运用 SQL Server 数据库的 FOR XML PATH
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
起因?
今天歐陽冰提出一個報表需求,其核心部分可以簡化為這樣一張表格:
| 調度單號 | 與調度單相關的多張作業單號 |
| 001 | 0001/0002/0003 |
| 002 | 0004 |
| 003 | 0005/0006/0007/0008 |
從上述表格可以看出,如何把調度單的多行作業單明細的單號合并到同一行的一個字段中,并用斜杠 / 分隔,是這個需求的難點。
解決?
于是到網上去搜索了一下,有這樣一篇文章:靈活運用 SQL SERVER FOR XML PATH
其中介紹了 SQL Server 數據庫的 FOR XML PATH 關鍵字的用法。
在一句 SELECT 語句的最后加上 FOR XML PATH,就可以把整個結果數據集變成一個 xml 字符串。大家可以自行嘗試一下。
而如果使用 FOR XML PATH(''),則是去除所有 xml 節點標記,只剩下原原本本的數據。我們要的就是這個。
于是,我們可以寫 SQL:
SELECT DH.DH_DISPATCH_NO DISPATCH_NO, ( SELECT CLH.CLH_CARGO_LOAD_NO + '/' FROM TM_DISPATCH_CARGO_LOAD_L DCLL, TM_CARGO_LOAD_H CLH WHERE DH.BILLID = DCLL.BILLID AND DCLL.DCLL_CARGO_LOAD_HEADER_ID = CLH.BILLID FOR XML PATH('') ) NOS FROM TM_DISPATCH_H DH GROUP BY DH.BILLID, DH.DH_DISPATCH_NO ;這樣就已經差不多了,但是多張作業單號這一列最后總是多個斜杠 /。
為了把最后這個斜杠去掉,我們還要使用一下 LEFT 函數。那么最終可以使用這樣一句 SQL 來滿足上述需求:
SELECT DISPATCH_NO, LEFT(NOS, LEN(NOS)-1) CARGO_LOAD_NOS FROM ( SELECT DH.DH_DISPATCH_NO DISPATCH_NO, ( SELECT CLH.CLH_CARGO_LOAD_NO + '/' FROM TM_DISPATCH_CARGO_LOAD_L DCLL, TM_CARGO_LOAD_H CLH WHERE DH.BILLID = DCLL.BILLID AND DCLL.DCLL_CARGO_LOAD_HEADER_ID = CLH.BILLID FOR XML PATH('') ) NOS FROM TM_DISPATCH_H DH GROUP BY DH.BILLID, DH.DH_DISPATCH_NO ) TMP ORDER BY DISPATCH_NO ;轉載于:https://www.cnblogs.com/suding1188/archive/2012/03/12/2391673.html
總結
以上是生活随笔為你收集整理的灵活运用 SQL Server 数据库的 FOR XML PATH的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CSS一些有趣的东西
- 下一篇: 5个常用的设计模式