Sql server 如何准备while(@@rowcount>;0)

Sql server 如何准备while(@@rowcount>;0),sql-server,tsql,while-loop,Sql Server,Tsql,While Loop,我正在使用sql server 我有一段这样的代码 while(@@rowcount>0) begin --do stuff end 问题是,我想做一些整洁的东西,确保第一次迭代能够运行。你打算先说什么?目前,我使用了 select 'Calling this to initialize @@rowcount to 1' 这是不言自明的,但如果有更好的方法,我想知道。添加变量可以单独处理初始条件,并保留@@RowCount的值,如果执行操作可能有几个步骤: declare @RowC

我正在使用sql server

我有一段这样的代码

while(@@rowcount>0)
begin
--do stuff
end
问题是,我想做一些整洁的东西,确保第一次迭代能够运行。你打算先说什么?目前,我使用了

select 'Calling this to initialize @@rowcount to 1' 

这是不言自明的,但如果有更好的方法,我想知道。

添加变量可以单独处理初始条件,并保留
@@RowCount的值,如果执行操作可能有几个步骤:

declare @RowCount as Int = 42;
-- Initialize   @RowCount   to skip the loop entirely, if appropriate.

while @RowCount > 0
  begin
  -- Do stuff;
  set @RowCount = @@RowCount;
  -- Perhaps do more stuff that might affect   @@RowCount .
  end;
或者,可以使用变量仅处理循环的第一次传递:

declare @FirstPass as Bit = 1;
-- Initialize   @FirstPass to skip the loop entirely, if appropriate.
-- Note that the loop will always be entered once if   @@RowCount   has not been cleared.

while @@RowCount > 0 or @FirstPass = 1
  begin
  set @FirstPass = 0;
  -- Do stuff;
  end;

我倾向于使用第一种方法,因为它清晰、简单,并提供了一个捕获的值
@@RowCount
,可用于日志记录、调试。。。不必担心哪些语句可能会改变值。

添加一个变量允许您单独处理初始条件,并保留
@@RowCount的值,如果执行操作可能有几个步骤:

declare @RowCount as Int = 42;
-- Initialize   @RowCount   to skip the loop entirely, if appropriate.

while @RowCount > 0
  begin
  -- Do stuff;
  set @RowCount = @@RowCount;
  -- Perhaps do more stuff that might affect   @@RowCount .
  end;
或者,可以使用变量仅处理循环的第一次传递:

declare @FirstPass as Bit = 1;
-- Initialize   @FirstPass to skip the loop entirely, if appropriate.
-- Note that the loop will always be entered once if   @@RowCount   has not been cleared.

while @@RowCount > 0 or @FirstPass = 1
  begin
  set @FirstPass = 0;
  -- Do stuff;
  end;

我倾向于使用第一种方法,因为它清晰、简单,并提供了一个捕获的值
@@RowCount
,可用于日志记录、调试。。。不必担心哪些语句可能会改变值。

您可以使用旧的GOTO

startloop:
  -- do stuff
IF @@rowcount > 0 GOTO startloop

你可以用旧的GOTO

startloop:
  -- do stuff
IF @@rowcount > 0 GOTO startloop

这比公认的答案要短

select 1
while(@@rowcount>0)
begin
--do stuff
end

这比公认的答案要短

select 1
while(@@rowcount>0)
begin
--do stuff
end


听起来像是XY问题,可能有更好的方法来组织查询。这里最好的方法是使用基于集合的方法,而不是使用循环。我正在使用一些令人头痛的调用patindex的东西,以便将NVarcher的每个非数字序列替换为特定的符号。我每次迭代只做一种模式,我怀疑是否有一种基于集合的方法可以做到这一点,而这种方法并不复杂得离谱。我想发个帖子,但我厌倦了负面的名声;)我想如果你对表演还满意的话,就这样吧。我不知道你的替换逻辑是什么,所以我实在帮不了你。我怀疑它可以在设定的基础上完成,但不能确定。听起来像是XY问题,可能有更好的方法来组织您的查询。这里最好的方法是使用基于集合的方法,而不是使用循环。我正在使用一些令人头痛的调用patindex的东西,以便将nvarchar的每个非数字序列替换为特定的符号。我每次迭代只做一种模式,我怀疑是否有一种基于集合的方法可以做到这一点,而这种方法并不复杂得离谱。我想发个帖子,但我厌倦了负面的名声;)我想如果你对表演还满意的话,就这样吧。我不知道你的替换逻辑是什么,所以我实在帮不了你。我怀疑它可以基于集合来完成,但实际上无法确定。这是QA在询问问题时使用的解决方案question@t-clausen.dk你确定这是OP使用的精确解吗?我打赌他们不知道他们可以使用静态选择。非常确定:选择“调用此命令将@rowcount初始化为1”@t-clausen.dk,那么他们为什么不发布静态选择?这是一个静态选择这是QA在询问question@t-clausen.dk你确定这是OP使用的精确解吗?我打赌他们不知道他们可以使用静态选择。非常确定:选择“调用此函数将@rowcount初始化为1”@t-clausen.dk,那么他们为什么不发布静态选择?这是一个静态选择