T-SQL游标循环语法

时间:2015-04-14 16:52:41

标签: sql-server tsql cursor

只是一个简单的风格问题,我一直很好奇。

规范的仅向前游标循环是这样的。

DECLARE table_data FORWARD_ONLY CURSOR FOR
SELECT c1, c2
FROM t1;

DECLARE @c1 int;
DECLARE @c2 int;

OPEN table_data;
FETCH table_data INTO @c1, @c2;
WHILE @@FETCH_STATUS = 0 BEGIN
    -- do something with @c1, @c2
    FETCH table_data INTO @c1, @c2;
END;

CLOSE table_data;
DEALLOCATE table_data;

有一个次要的代码样式问题,因为FETCH语句是逐字重复的。是否有任何理由认为这是"标准"循环时它可以像这样轻松地写出来吗?

OPEN table_data;
WHILE 1 = 1
    FETCH table_data INTO @c1, @c2;
    IF @@FETCH_STATUS != 0 BREAK;
    -- do something with @c1, @c2
END;

我并不是真的在寻找哪种方式更好的意见。我只是好奇是否有一个原因,第一种方式似乎是压倒性的标准,可以说它有这个缺点。我无法看到的无限循环版本是否存在问题?

我猜测原因是BREAK是最近添加的T-SQL,但是我无法找到T-SQL语言的更改日志以确认这一假设。

1 个答案:

答案 0 :(得分:0)

我看到的最常见的方式是第一种方式。正如Sean所提到的,1 = 1可能会意外地以无限循环结束,所以它可能是较小的选择。无论哪种方式,谁知道人们为什么这么做?当他们可能不需要时,那些决定使用光标的人就是那些人。如果我需要一个类似循环的解决方案,我总是使用递归CTE,所以我从不使用游标加上他们的语法是令人讨厌的。如果我在光标和while循环之间做出选择(比如选择要喝哪种毒药),我选择WHILE循环因为语法简单得多。