只是一个简单的风格问题,我一直很好奇。
规范的仅向前游标循环是这样的。
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语言的更改日志以确认这一假设。
答案 0 :(得分:0)
我看到的最常见的方式是第一种方式。正如Sean所提到的,1 = 1可能会意外地以无限循环结束,所以它可能是较小的选择。无论哪种方式,谁知道人们为什么这么做?当他们可能不需要时,那些决定使用光标的人就是那些人。如果我需要一个类似循环的解决方案,我总是使用递归CTE,所以我从不使用游标加上他们的语法是令人讨厌的。如果我在光标和while循环之间做出选择(比如选择要喝哪种毒药),我选择WHILE循环因为语法简单得多。