不使用存储过程或函数,能否生成X行记录?

3

我使用了一个UDF编写了下面的VIEW,但我想知道是否有一种不需要UDF的方法。我唯一找到的其他选项是选择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)
1个回答

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

第二个SELECT语句末尾的"N < 10"部分指定了"count"。
输出结果为:
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

@Lucero,好发现。所以比我想的简单。(不需要先前的id) - Kirk Woll
我在适应它的过程中也发现了这一点。我需要数字像for(int i=0;i<10;i++)那样,所以我不得不将其更改为SELECT 0 AS N和WHERE N < 9。以前从未听说过递归CTE,这对我帮助很大!再次感谢! - Dennis George

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接