小弟認為使用SPT_VALUES比CTE更直覺的去解這個問題,效能也許第一次不比CTE快,但第二次將SPT_VALUES載入記憶體後,就不輸CTE囉,而且重點是此方法從SQL 2000到SQL 2012 (RC0)都適用
DECLARE @startDate
AS DATETIME , @EndDate AS DATETIME
SET @startdate
= '20090101'
SET @enddate
= '20121231'
SELECT
DATEADD(dd,NUMBER,@startDate) ,DATENAME(dw,DATEADD(dd,NUMBER,@startDate))
FROM MASTER..SPT_VALUES
WHERE TYPE='P'
AND
DATEPART(dw,DATEADD(dd,NUMBER,@startDate))=1
AND DATEADD(dd,NUMBER,@startDate)<= @enddate
注意利用SPT_VALUES提取的數量不能超過2048,因為NUMBER(TYPE='P')的範圍在0-2047
什麼時候會用SPT_VALUES這個呢?通常拿來產生一年的日期列表,或是1000以內的自然數都很方便
0 意見:
張貼留言