我读到了一种生成一系列日期的方法: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
似乎最后一个声明必须以分号结尾'或者附近的语法不正确;'根据分号的存在而抛出。
你有任何指示吗?我好像很生气。
答案 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;