SQL Server 中master..spt_values的應(yīng)用
今天在做數(shù)據(jù)分析報(bào)表的時(shí)候遇到一個(gè)這樣的問題。
表結(jié)構(gòu)如下。
部門編碼、部門名稱、部門人員ID(中間用逗號(hào)分割)
我想通過和人員表鏈接,查詢出一個(gè)新的數(shù)據(jù)集,查詢出的結(jié)果集格式如下:
人員信息(ID或者姓名)、部門編碼、部門名稱
?
以前都是通過程序遍歷拆分表字段組成新的集合字段,然后在結(jié)合SQL語句查詢出結(jié)果集,但是這個(gè)報(bào)表要求只能通過SQL語句實(shí)現(xiàn),以前記得可以通過寫字段分割函數(shù)再結(jié)合游標(biāo)實(shí)現(xiàn)。然而今天在網(wǎng)上無意間找到一個(gè)新的方法。用“master..spt_values”來實(shí)現(xiàn),具體實(shí)現(xiàn)方法見下面實(shí)例1感覺這個(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而言該語句不試用于2013-08-31的情況,這時(shí)由于9月沒有31號(hào),固計(jì)算出來的天數(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?
*/




