灵活运用 SQL Server 数据库的 FOR XML PATH
起因?
今天歐陽(yáng)冰提出一個(gè)報(bào)表需求,其核心部分可以簡(jiǎn)化為這樣一張表格:
| 調(diào)度單號(hào) | 與調(diào)度單相關(guān)的多張作業(yè)單號(hào) |
| 001 | 0001/0002/0003 |
| 002 | 0004 |
| 003 | 0005/0006/0007/0008 |
從上述表格可以看出,如何把調(diào)度單的多行作業(yè)單明細(xì)的單號(hào)合并到同一行的一個(gè)字段中,并用斜杠 / 分隔,是這個(gè)需求的難點(diǎn)。
解決?
于是到網(wǎng)上去搜索了一下,有這樣一篇文章:靈活運(yùn)用 SQL SERVER FOR XML PATH
其中介紹了 SQL Server 數(shù)據(jù)庫(kù)的 FOR XML PATH 關(guān)鍵字的用法。
在一句 SELECT 語(yǔ)句的最后加上 FOR XML PATH,就可以把整個(gè)結(jié)果數(shù)據(jù)集變成一個(gè) xml 字符串。大家可以自行嘗試一下。
而如果使用 FOR XML PATH(''),則是去除所有 xml 節(jié)點(diǎn)標(biāo)記,只剩下原原本本的數(shù)據(jù)。我們要的就是這個(gè)。
于是,我們可以寫 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 ;這樣就已經(jīng)差不多了,但是多張作業(yè)單號(hào)這一列最后總是多個(gè)斜杠 /。
為了把最后這個(gè)斜杠去掉,我們還要使用一下 LEFT 函數(shù)。那么最終可以使用這樣一句 SQL 來(lái)滿足上述需求:
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 ;轉(zhuǎn)載于:https://www.cnblogs.com/suding1188/archive/2012/03/12/2391673.html
總結(jié)
以上是生活随笔為你收集整理的灵活运用 SQL Server 数据库的 FOR XML PATH的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: CSS一些有趣的东西
- 下一篇: 5个常用的设计模式