2013-05-06 86 views
0

我有下面的代碼運行一個循環插入日期憤怒到夯實表,這是工作的罰款:如何將循環語句應用於sql中的臨時表?

;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 

然而,當我試圖將記錄插入如下所示的夯實表中時,它似乎不適合我:

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 

,我可以通過夯實表#TEST插入像第2碼1號代碼相同的記錄什麼辦法?

+0

問題沒有意義。你不能從空表中選擇! – 2013-05-06 00:18:21

回答

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