2011-05-10 42 views
4

有一些方法可以在SQL中實現無限循環?我想對有的像選擇裏面一個又一個,遞歸......(也許我講的愚蠢)SQL中的無限循環?

回答

11

你可以做一個CTE遞歸無限循環:

;with rec as 
     (
     select 1 as n 
     union all 
     select n + 1 
     from rec 
     ) 
select n 
from rec 

默認情況下,SQL服務器將停止在100;你可以讓它永遠循環下去:

option (maxrecursion 0) 
+0

+1 - 比其他人(包括我的)更原始! – JNK 2011-05-10 19:01:14

+0

你需要添加'OPTION(MAXRECURSION = 0)'使這個無限,對不對? – 2011-05-10 19:03:58

+0

事實證明,這隻適用於SQL 2005或更高版本 - 對於SQL 2000: – jiaoziren 2012-05-28 02:27:59

5
WHILE 1=1 
BEGIN 
SELECT 'This will go forever' 
END 
+0

我不是故意把你的評論放在你的答案上,對不起。大聲笑我只是澄清說明性陳述(你的不是)不能遞歸。你的回答很好。 :-) – richard 2011-05-10 19:00:58

+0

@理查德 - 我抓住了,不用擔心:) – JNK 2011-05-10 19:02:04

1
DECLARE @number INT = 3 

WHILE (@number = 3) 
BEGIN 
    PRINT @number 
END 
2

我無法想象,你爲什麼會想這樣做,但它要依賴在您的實現的(SQL Server,Oracle,MySQL ...)支持的循環結構中。

例如,在SQL Server中,您將以任何命令式語言的方式編寫無限循環。粗略地說:

DECLARE @x INT = 0 
WHILE (@x = 0) 
BEGIN 
    PRINT @x 
END 
0

你不能創建一個像SQL這樣的聲明語言的無限循環,因爲編譯器不會讓你。你會得到錯誤信息和/或它不會運行。

您需要像JNK建議的那樣,使用SQL來順序編寫某些內容。

3

這應該在Oracle工作

select * from (select level x from dual connect by level >=0) 

外部選擇是需要避免一些優化與客戶端和數據庫的一些組合發生。

不完全確定level >= 0部件是否按預期工作,因爲通常情況下,您只能將其與level <= 50之類的東西一起使用以獲取固定行數。

+0

我發現這個解決方案在自動測試邏輯時非常有用,它負責正確地查殺長時間運行的查詢。沒有它,我將不得不找到一些大表或交叉連接許多表,這取決於數據庫中的數據,並導致不穩定和脆弱的測試。 – 2014-10-01 09:04:43