尝试CROSS APPLY,因为它将为JOINed表中的每一行运行函数:
SELECT [Date Value]
FROM dbo.Start_End_Table dates
CROSS APPLY [dbo].[DatesBetween](dates.StartDate, dates.EndDate)
WHERE [Week Number]=@WeekNumber;
示例输出类似于开始日期=1/1/2014,结束日期=1/3/2014,@weeknumber=1:
| DateValue
1/1/2014
1/2/2014
1/3/2014
SQL Fiddle
编辑:
尝试以下内联表值函数,因为它将比多行TVF快得多,因为:
-
内联TVF固有地比多线TVF更快
-
它是基于设置的,而不是依赖于WHILE循环
--
CREATE FUNCTION dbo.GetDates(@StartDate DATETIME, @EndDate DATETIME)
RETURNS TABLE
AS RETURN
WITH cte AS
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS [RowNum]
FROM sys.objects WITH (NOLOCK)
)
SELECT DATEADD(DAY, (cte.[RowNum] - 1), @StartDate) AS [DateValue]
FROM cte
WHERE cte.[RowNum] < (DATEDIFF(DAY, @StartDate, @EndDate) + 2);
GO
SELECT * FROM dbo.GetDates('1/1/2014', '1/3/2014');