首页 > 解决方案 > 日期生成器到表变量

问题描述

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

似乎“最后一条语句必须以分号结尾”或“附近的语法不正确;” 根据分号的存在抛出。

你有什么方向吗?我像疯了一样困惑。

标签: sqlsql-server

解决方案


您的问题不是 CTE,而是INSERT语法。如文档中所述,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;

推荐阅读