日期生成器到表变量

时间:2018-05-28 12:32:32

标签: sql sql-server

我读到了一种生成一系列日期的方法: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

似乎最后一个声明必须以分号结尾'或者附近的语法不正确;'根据分号的存在而抛出。

你有任何指示吗?我好像很生气。

1 个答案:

答案 0 :(得分:0)

您的问题不是CTE,而是INSERT语法。正如documentation中所述,CTE位于INSERT

之前
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;