0

我有以下代码来运行循环以将日期范围插入到 tamp 表中,这工作正常:

;WITH testOne([dDate], Leave)
AS
( 
   SELECT CONVERT(DATE, '2013-05-06') 'dDate', 1
   UNION ALL
   SELECT DATEADD(dd,1,ad.dDate), 1
   FROM testOne ad
   WHERE ad.dDate < CONVERT(DATE, '2013-05-08') 
)

结果将如下所示:

aDate       Leave
2013-05-06  1
2013-05-07  1
2013-05-08  1

但是,当我尝试将记录插入到 tamp 表中时,如下所示,它似乎对我不起作用:

CREATE TABLE #testTwo 
(
    dDate date,
    Leave int 
)



INSERT INTO #testTwo 
        ( dDate, Leave )
SELECT CONVERT(DATE, '2013-05-06') 'dDate', 1
UNION ALL
SELECT DATEADD(dd,1,ad.dDate), 1
FROM #testTwo ad
WHERE ad.dDate < CONVERT(DATE, '2013-05-08')  

结果将如下所示:

aDate       Leave
2013-05-06  1

有什么方法可以通过使用 tamp table #test 插入与第一个代码和第二个代码相同的记录吗?

4

1 回答 1

2

您的第一个示例是一个称为“递归公用表表达式”的特殊构造。这不是一个临时表,只是一种特殊的查询,它可以递归(或迭代地)引用它自己的输出。

据我所知,这是纯 SQL(即不是嵌入式过程语言)中实现这种递归的唯一方法。

您没有显示的实际上是将递归 CTE 用于任何事情。如果您想将该结果插入到表中,您只需要继续使用该 CTE,但使用插入语句。我不确定您使用的是什么 DBMS,因此无法确认这将是确切的语法,但应该是这样的:

WITH testOne(dDate, Leave)
AS
( 
   SELECT CONVERT(DATE, '2013-05-06'), 1
   UNION ALL
   SELECT DATEADD(dd,1,ad.dDate), 1
   FROM testOne ad
   WHERE ad.dDate < CONVERT(DATE, '2013-05-08') 
)
INSERT INTO #testTwo ( dDate, Leave )
SELECT dDate, Leave
FROM testOne
于 2013-05-06T00:35:09.220 回答