怎么在T-SQL中实现递归查询

如何在T-SQL中实现递归查询?
如下图,有这么一张数据表DayPrice(日报价表)
怎么在T-SQL中实现递归查询
有两列,分别是日期和价格
假如这张表的作用是存储每日报价,但周末2天以及各种3-7天的假期等都没有报价,但要求查询结果中,没有报价的日期要取前一天的价格做为当天报价,比如下图中,4月11日和12日为周末,则4月11日要取4月10日的价格,4月12日要取4月11日价格。同理7天的假期也应如此。
那么当我们按照一定时间范围查询报价,比如就按4月6日-12日的日期查询,怎么写SQL才能完成上面的需求?(不考虑存储过程)
谢谢各位!
------解决思路----------------------

create table dayprice
(
D date,
price int
)

insert into dayprice values ('2014-4-6',1000);
insert into dayprice values ('2014-4-7',1100);
insert into dayprice values ('2014-4-8',1200);
insert into dayprice values ('2014-4-9',1300);
insert into dayprice values ('2014-4-10',1400);
insert into dayprice values ('2014-4-13',1500);
insert into dayprice values ('2014-4-14',1600);
insert into dayprice values ('2014-4-15',1700);
insert into dayprice values ('2014-4-16',1800);
insert into dayprice values ('2014-4-17',1900);

with cte as
(
select cast('2014-4-6' as date) as D
union all
select DATEADD(d,1,D) as D from cte where D<'2014-4-17'
),
cte2 as
(
select 
cte.D,t.price
from cte left join dayprice t on cte.D=t.D
)
select T1.D,case when 
T1.price is null
then(select top 1  price from cte2 T2 where T2.D<T1.D and T2.price IS not null Order by T2.D desc)
else T1.price
end as price
from cte2 T1

D          price
---------- -----------
2014-04-06 1000
2014-04-07 1100
2014-04-08 1200
2014-04-09 1300
2014-04-10 1400
2014-04-11 1400
2014-04-12 1400
2014-04-13 1500
2014-04-14 1600
2014-04-15 1700
2014-04-16 1800
2014-04-17 1900

(12 行受影响)


------解决思路----------------------
if OBJECT_ID('tempdb..#t','U') > 0
  drop table #t
  
create table #t
(
  dday datetime,
  price int
)

insert into #t values
('2015-04-1',100),
('2015-04-2',110),
('2015-04-3',120),
('2015-04-4',130),
('2015-04-5',140),
('2015-04-8',150),
('2015-04-9',160),
('2015-04-10',200),
('2015-04-16',330),
('2015-04-17',120),
('2015-04-18',130),
('2015-04-20',150);
GO
DECLARE @SDATE DATETIME='2015-04-6' ,@EDATE DATETIME='2015-04-15'
WITH CTE AS
(
SELECT *,ROW_NUMBER()OVER(ORDER BY DDAY) ID FROM #T A
)
,CTE1 AS
(
SELECT A.*,DATEDIFF(DAY,A.dday,B.dday) CHAYI FROM CTE A
  LEFT JOIN CTE B ON B.ID = A.ID+1
)
,CTE2 AS
(
SELECT DATEADD(DAY,number,dday) newday,A.*,B.number FROM CTE1 A
  JOIN master..spt_values B ON B.type ='P' AND number>=0 AND number < A.CHAYI
)
SELECT * FROM CTE2 WHERE newday BETWEEN @SDATE AND @EDATE  

------解决思路----------------------
--我这边把开始和结束时间提取出来作参数,你如果不需要可以直接代进去
DECLARE @StartDate DATETIME,@EndDate DATETIME
SET @StartDate='20150405'
SET @EndDate='20150414'

;WITH CTE AS(
SELECT *,ROW_NUMBER()OVER(ORDER BY [datetime])RN
FROM TB
)
,CTE2 AS(
SELECT ISNULL(T1.[datetime],'1900-01-01')StartTime
,ISNULL(T2.[datetime],'9999-12-31')EndTime
,ISNULL(T1.price,0)price
FROM CTE T1
FULL JOIN CTE T2 ON T1.RN=T2.RN-1
)
SELECT DATEADD(DAY,T1.number,@StartDate)
,T2.price
FROM master..spt_values T1
JOIN CTE2 T2 ON DATEADD(DAY,T1.number,@StartDate)>=T2.StartTime AND DATEADD(DAY,T1.number,@StartDate)<T2.EndTime
WHERE T1.type='P'AND T1.number<DATEDIFF(DAY,@StartDate,@EndDate)