Sql server SQL Server for循环记录

Sql server SQL Server for循环记录,sql-server,Sql Server,在Oracle中,我们可以使用 FOR employee_rec in (select id from mytbl) LOOP DBMS_OUTPUT.PUT_LINE(employee_rec.id); END LOOP; 在SQL Server中,我们是否有类似的功能?如果没有,如何执行此循环?在SQL Server中,如果您想正确地执行此操作,它会更详细一些: DECLARE @id INT; DECLARE c CURSOR LOCAL STATIC READ_ONLY FO

在Oracle中,我们可以使用

FOR employee_rec in (select id from mytbl)
LOOP
    DBMS_OUTPUT.PUT_LINE(employee_rec.id);
END LOOP;

在SQL Server中,我们是否有类似的功能?如果没有,如何执行此循环?

在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;

然而,通常我们倾向于避免循环和游标,因为关系数据库擅长基于集合的操作(在几乎所有情况下)。当然也有例外,就像任何规则一样,但如果我不得不猜测的话,我会怀疑你不需要循环来做你想做的事情。你到底想干什么?为什么需要单独处理每一行?

如果希望正确处理,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;

然而,通常我们倾向于避免循环和游标,因为关系数据库擅长基于集合的操作(在几乎所有情况下)。当然也有例外,就像任何规则一样,但如果我不得不猜测的话,我会怀疑你不需要循环来做你想做的事情。你到底想干什么?为什么您需要单独处理每一行?

请查看以下答案:Oracle比SQl Server更适合循环,您需要开始考虑处理整组数据,而不是一次处理一条记录。请查看以下答案:Oracle比SQl Server更适合循环,您需要开始考虑处理整组数据,而不是一次处理一条记录。谢谢。我们有更简洁的方法吗?你看,Oracle只有4行。如果这是选择Oracle而不是SQL Server的原因,请坚持使用Oracle。您可以在T-SQL中将其缩短一点,或者您可以投入EF/Linq的世界,在那里您可以编写非常简洁且效率低下的循环。真正的答案是,正如我试图给你们留下深刻印象的那样,首先把它看作一个循环是有缺陷的。请尝试解决“您试图对集合执行什么操作”的问题,而不是“您试图对每一行执行什么操作”。仅当基于集合的方法过于复杂或存在固有的性能问题时,才转到光标。谢谢。我们有更简洁的方法吗?你看,Oracle只有4行。如果这是选择Oracle而不是SQL Server的原因,请坚持使用Oracle。您可以在T-SQL中将其缩短一点,或者您可以投入EF/Linq的世界,在那里您可以编写非常简洁且效率低下的循环。真正的答案是,正如我试图给你们留下深刻印象的那样,首先把它看作一个循环是有缺陷的。试着解决“你想对集合做什么”的问题,而不是“你想对每一行做什么”。只有当基于集合的方法太复杂或存在固有的性能问题时,才转向游标。