SQL Server for循环记录

use*_*234 0 sql-server

在Oracle中,我们可以使用

FOR employee_rec in (select id from mytbl)
LOOP
    DBMS_OUTPUT.PUT_LINE(employee_rec.id);
END LOOP;
Run Code Online (Sandbox Code Playgroud)

在SQL Server中,我们有类似的东西吗?如果没有,如何进行此循环?

Aar*_*and 6

如果你想做正确的话,它在SQL Server中会更加冗长:

DECLARE @id INT;

DECLARE c CURSOR LOCAL STATIC READ_ONLY FORWARD_ONLY
FOR SELECT id FROM mytbl;

OPEN c;

FETCH NEXT FROM c INTO @id;

WHILE @@FETCH_STATUS = 0
BEGIN
  PRINT @id;

  FETCH NEXT FROM c INTO @id;
END

CLOSE c;
DEALLOCATE c;
Run Code Online (Sandbox Code Playgroud)

但是,通常我们倾向于避免循环和游标,因为关系数据库在基于集合的操作方面表现优异(在几乎情况下).当然也有例外,就像任何规则一样,但如果我不得不猜测我会怀疑你不需要循环去做你想要做的事情.你真的想做什么?为什么需要单独处理每一行?

  • 如果这是选择Oracle over SQL Server的原因,请坚持使用Oracle.您可以在T-SQL中缩短它,或者您可以将自己置身于EF/Linq的世界中,您可以在其中编写非常简洁且效率低下的循环.正如我试图给你留下深刻印象的那样,真正的答案是,首先将其视为一个循环是有缺陷的.尝试解决问题"你想要做什么*到集合*"而不是"你想要做什么*每行*." 仅当基于集合的方法过于复杂或存在固有的性能问题时才转向光标. (2认同)