2011-05-10 146 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