可以在不使用存储过程或函数的情况下生成X#行?

Den*_*rge 3 sql t-sql user-defined-functions sql-server-2008

我使用UDF编写了下面的VIEW,但是我想知道是否有办法在不需要UDF的情况下执行此操作.我能找到的唯一其他选项是SELECT UNION硬编码值,但我不喜欢这样.有什么建议或者我应该保留原样吗?我正在使用MS SQL Server 2008 R2,所以任何可用的都是免费游戏.

CREATE FUNCTION GetN(@N int)
RETURNS @numbers TABLE (N int PRIMARY KEY NOT NULL)
AS
BEGIN
    DECLARE @i int
    SET @i = 0
    WHILE (@i < @N)
    BEGIN
        INSERT @numbers SELECT @i
        SET @i = @i + 1
    END
    RETURN
END
GO

CREATE VIEW Last10Weeks AS
SELECT DATEPART(wk, GETDATE())-N as WeekNumber
, DATEADD(day, (N*-7) - 1 - (DATEPART(dw, GETDATE()) + @@DATEFIRST - 2) % 7, GETDATE()) AS StartDate 
, DATEADD(day, (N*-7) + 5 - (DATEPART(dw, GETDATE()) + @@DATEFIRST - 2) % 7, GETDATE()) AS EndDate 
FROM GetN(10)
Run Code Online (Sandbox Code Playgroud)

Kir*_*oll 5

这是一种使用递归CTE的方法:

WITH 
    TestData as (
        SELECT 1 as N
        UNION ALL
        SELECT N + 1 FROM TestData WHERE N < 10
    )
SELECT 
    N,
    DATEPART(wk, GETDATE())-N as WeekNumber,
    DATEADD(day, (N*-7) - 1 - (DATEPART(dw, GETDATE()) + @@DATEFIRST - 2) % 7, GETDATE()) AS StartDate,
    DATEADD(day, (N*-7) + 5 - (DATEPART(dw, GETDATE()) + @@DATEFIRST - 2) % 7, GETDATE()) AS EndDate
FROM
    TestData
Run Code Online (Sandbox Code Playgroud)

"count"由第二个SELECT结束时的"N <10"部分指定.

打印出来:

N   WeekNumber  StartDate   EndDate
1   39  2011-09-18 15:24:40.800 2011-09-24 15:24:40.800
2   38  2011-09-11 15:24:40.800 2011-09-17 15:24:40.800
3   37  2011-09-04 15:24:40.800 2011-09-10 15:24:40.800
4   36  2011-08-28 15:24:40.800 2011-09-03 15:24:40.800
5   35  2011-08-21 15:24:40.800 2011-08-27 15:24:40.800
6   34  2011-08-14 15:24:40.800 2011-08-20 15:24:40.800
7   33  2011-08-07 15:24:40.800 2011-08-13 15:24:40.800
8   32  2011-07-31 15:24:40.800 2011-08-06 15:24:40.800
9   31  2011-07-24 15:24:40.800 2011-07-30 15:24:40.800
10  30  2011-07-17 15:24:40.800 2011-07-23 15:24:40.800
Run Code Online (Sandbox Code Playgroud)