代码之家  ›  专栏  ›  技术社区  ›  Felix

日期生成器到表变量

  •  1
  • Felix  · 技术社区  · 6 年前

    我读到一种生成日期范围的方法: Generate a set or sequence without loops 。我在应用这个方法上遇到困难。

    此代码成功生成日期表 @Start @End :

    ;WITH d([Date]) AS (
        SELECT DATEADD(DAY, n-1, @Start)
        FROM (
            SELECT TOP (DATEDIFF(DAY, @Start, @End) + 1)
            ROW_NUMBER() OVER (ORDER BY Number) FROM master..spt_values
        ) AS x(n)
    )
    SELECT d.Date
    FROM d
    

    我对更高级的SQL还比较陌生,所以这就是黑盒。但它起作用了。所以现在我想将结果保存到一个表变量中,以便进一步处理:

    DECLARE @Days TABLE ([Date] DATE NULL, Val INT NULL)
    

    日期将具有与其关联的值。然而,仅仅插入到表中似乎不起作用。以下语句或将其包装在另一个select语句中都不起作用:

    INSERT INTO @Days (Date)
    WITH d([Date]) AS (
        SELECT DATEADD(DAY, n-1, @Start)
        FROM (
            SELECT TOP (DATEDIFF(DAY, @Start, @End) + 1)
            ROW_NUMBER() OVER (ORDER BY Number) FROM master..spt_values
        ) AS x(n)
    )
    SELECT d.Date
    FROM d
    

    似乎“最后一条语句必须以分号结尾”,或者根据分号的存在而抛出“incorrect syntax near;”。

    你有什么指示吗?我很困惑。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Gordon Linoff    6 年前

    你的问题不是CTE,而是 INSERT 语法。如中所述 documentation ,CTE先于 插入 :

    WITH d([Date]) AS (
        SELECT DATEADD(DAY, n-1, @Start)
        FROM (
            SELECT TOP (DATEDIFF(DAY, @Start, @End) + 1)
            ROW_NUMBER() OVER (ORDER BY Number) FROM master..spt_values
        ) AS x(n)
    )
    INSERT INTO @Days (Date)
        SELECT d.Date
        FROM d;