Можно ли генерировать X # строк без использования хранимых процедур или функций? - PullRequest
3 голосов
/ 30 сентября 2011

Я написал нижеследующий ПРОСМОТР, используя UDF, но мне интересно, есть ли способ сделать это без необходимости 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 голосов
/ 30 сентября 2011

Вот способ использования рекурсивного 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

"Счет" определяется частью "N <10" в конце второго SELECT. </p>

Распечатывает:

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
...