2017-08-08 143 views
1

我有一個場景,使用while循環如下所示將臨時表中的記錄存儲在臨時表中。我們可以使用SQL Server中的while循環將記錄存儲在臨時表中嗎?

對於實例

DECLARE @intFlag INT 
SET @intFlag = 1 
WHILE (@intFlag <=5) 
BEGIN 
    PRINT @intFlag 
    SET @intFlag = @intFlag + 1 
    select @intFlag datas 
    into #tempped 
END 
GO 

是否有可能做這樣嗎?

+1

樣本數據和預期的結果將有助於回答這個問題(事實上,所有sql問題)。 –

+0

你剛剛嘗試過嗎?我想它的工作 –

+0

@EstebanP。它永遠不會工作。它會顯示錯誤信息msg數據庫中已經有一個名爲'#tempped'的對象@ –

回答

2

您可以在循環中創建臨時表並將insert創建到它中。例如: -

create table #tempped (datas int); 

DECLARE @intFlag INT 
SET @intFlag = 1 
WHILE (@intFlag <=5) 
BEGIN 
    PRINT @intFlag; 

    insert into #tempped (datas) 
    select @intFlag; 

    SET @intFlag = @intFlag + 1; 
END 
GO 

我認爲這個問題是一個抽象的,如果你有興趣在性能上則while循環,遞歸CTE,或光標不是最高效的解決方案。相反,使用數字或理貨表。

延伸閱讀:

+0

謝謝你天才..我會在6分鐘後接受答案。 –

+0

@mohamedfaiz樂意幫忙! – SqlZim

+1

@mohamedfaiz我建議考慮使用複雜的CTE路線,特別是如果您將進行任何數量的嚴重迭代。一般來說,您希望遠離基於循環的操作並堅持以SET爲基礎的操作! – Matt

3

這是一個使用遞歸CTE另一種解決方案:

;WITH 
    cte(datas) AS 
    (
     SELECT  1 
     UNION ALL 
     SELECT  datas + 1 
     FROM  cte 
     WHERE  datas < 5 
    ) 

SELECT datas 
INTO #tempped 
FROM cte 
OPTION (MAXRECURSION 0) 
0

TALLY CTE的另一種選擇。這將工作長達10K記錄...

WITH 
    E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)), 
    E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows 
    E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max 
    cteTally(N) AS 
    (
     SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4 
    ) 

select N 
INTO #tempped 
FROM cteTally 
WHERE N <= 5 


SELECT * FROM cteTally 
SELECT * FROM #tempped 
DROP TABLE #tempped 

關於這個良好的部分是你可以創建一個視圖,它...從來沒有以後再擔心這個問題。也就是說,只要需要「數字表」加入,就可以引用該視圖。

create View [dbo].[cteTally] as 

    WITH 
     E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)), 
     E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows 
     E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max 
     cteTally(N) AS 
     (
      SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4 
     ) 
    select N from cteTally 
    GO 

然後,你的榜樣,你只是這樣做:

SELECT N 
INTO #tempped 
FROM cteTally 
WHERE N <=5 

Sean Lange獨到的見解......

相關問題