Sql server 如何准备while(@@rowcount>;0)
我正在使用sql server 我有一段这样的代码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
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,那么他们为什么不发布静态选择?这是一个静态选择