SQL Server 中master..spt_values的應(yīng)用
今天在做數(shù)據(jù)分析報(bào)表的時(shí)候遇到一個(gè)這樣的問(wèn)題。
表結(jié)構(gòu)如下。
部門(mén)編碼、部門(mén)名稱、部門(mén)人員ID(中間用逗號(hào)分割)
我想通過(guò)和人員表鏈接,查詢出一個(gè)新的數(shù)據(jù)集,查詢出的結(jié)果集格式如下:
人員信息(ID或者姓名)、部門(mén)編碼、部門(mén)名稱
?
以前都是通過(guò)程序遍歷拆分表字段組成新的集合字段,然后在結(jié)合SQL語(yǔ)句查詢出結(jié)果集,但是這個(gè)報(bào)表要求只能通過(guò)SQL語(yǔ)句實(shí)現(xiàn),以前記得可以通過(guò)寫(xiě)字段分割函數(shù)再結(jié)合游標(biāo)實(shí)現(xiàn)。然而今天在網(wǎng)上無(wú)意間找到一個(gè)新的方法。用“master..spt_values”來(lái)實(shí)現(xiàn),具體實(shí)現(xiàn)方法見(jiàn)下面實(shí)例1感覺(jué)這個(gè)東西太好用了。把網(wǎng)上的實(shí)例都整理了一下,希望各路大神批評(píng)指教,也希望大家繼續(xù)把這方面的應(yīng)用貼上.
?
select?number?from?master..spt_values?with(nolock)?where?type='P' /**解釋:master..spt_values表的字段值為P的對(duì)應(yīng)number字段值是從0-2047*/? ?? ?? --1.將字符串轉(zhuǎn)換為列顯示? ?? if?object_id('tb')?is?not?null?drop?table?tb? go? create?table?tb([編號(hào)]?varchar(3),[產(chǎn)品]?varchar(2),[數(shù)量]?int,[單價(jià)]?int,[金額]?int,[序列號(hào)]?varchar(8))? insert?into?tb([編號(hào)],[產(chǎn)品],[數(shù)量],[單價(jià)],[金額],[序列號(hào)])? select?'001','AA',3,5,15,'12,13,14'?union?all select?'002','BB',8,9,13,'22,23,24' go? select?[編號(hào)],[產(chǎn)品],[數(shù)量],[單價(jià)],[金額]? ,substring([序列號(hào)],b.number,charindex(',',[序列號(hào)]+',',b.number)-b.number)?as?[序列號(hào)]? from?tb?a?with(nolock),master..spt_values?b?with(nolock)? where?b.number>=1?and?b.number=1?and?number=1?and?number1? /**? value? -----? 朋? 友? 的? */? ---------? ?? ?? --4.提取兩個(gè)日期之間的所有月份? if?object_id('tb')?is?not?null?drop?table?tb? go? create?table?tb(id?int?identity(1,1),startDate?varchar(10),endDate?varchar(10))? insert?into?tb(startDate,endDate)?select?'2013-01-01','2013-09-25' go? declare?@startDate?varchar(10)? declare?@endDate?varchar(10)? select?@startDate=startDate,@endDate=endDate?from?tb?with(nolock)? select?convert(varchar(7),dateadd(mm,number,@startDate),120)?as?[月份]? from?master..spt_values?with(nolock)? where?type='P'?and?number>=0? and?dateadd(mm,number,@startDate)=1? --and?number<=datediff(dd,@date,dateadd(mm,1,@date))?--對(duì)于mssql而言該語(yǔ)句不試用于2013-08-31的情況,這時(shí)由于9月沒(méi)有31號(hào),固計(jì)算出來(lái)的天數(shù)是30天? and?number=left(@time,2)?and?b.number=1?and?number<=len(s)? and?substring('|'+s,number,1)='|' )select?left(ss,charindex(',',ss)-1)as?s1,substring(ss,charindex(',',ss)+1,len(ss))as?s2?from?cte? drop?table?tb? /**? s1?????????????s2? -----------?------------? 車位地址1??????車位狀況1? 車位地址2??????車位狀況2? 車位地址n??????車位狀況n? */