2012-01-26 167 views
1

我已经创建了SQL Server 2008中的存储过程,它包含了下面的代码片段:未初始化变量中While循环

WHILE (@COUNTER <= @COUNT_ROWSTOBEPROCESSED) 
    BEGIN 
     DECLARE @INFID AS INT =0; 
     DECLARE @TPID AS INT =0;   
     SELECT @INFID = InfID FROM @TEMPTABLE WHERE @@ROWCOUNT = @COUNTER; 
     print @INFID ; 
      SET @COUNTER = @COUNTER + 1;   
    END 

但它给了我下面的结果:

(106 row(s) affected) 
0 
-26 
0 
0 
0 
0 
0 
0 
0 
0 all are zeros .... 

我有已经在临时表中存储了值,但未初始化为@INFID变量。

为什么会发生?我不明白...

请帮助我,如果有人有解决方案。

----评论--- yeap,我已经看到我的代码。但是在这里我已经在我的代码中增加了计数器增量。但我仍然有同样的问题。 当我在循环内运行下面的查询。我发现@@行数始终为1

SELECT InfID,@ROWCOUNT FROM @TEMPTABLE WHERE @@ROWCOUNT = @COUNTER; 

u能告诉我如何使用迭代的不是Temptable每行while循环或在SQL循环?

+2

WHERE @@ ROWCOUNT = @ COUNTER'不正确。你想做什么? –

+0

每次运行SELECT语句时都不会改变@@ ROWCOUNT,因此它总是会选择第一个结果? –

+0

这是一个无限循环,因为'@COUNTER <= @ COUNT_ROWSTOBEPROCESSED'没有变化。 – danihp

回答

2

WHERE @@ROWCOUNT = @COUNTER不正确。

@@ROWCOUNT返回受前一条语句影响的行数。

它只会评估为true一次。 (当@COUNTER = 1时),所以余下的时间没有从SELECT操作中分配给@INFID

你想做什么?我最好的猜测是你需要添加一个IDENTITY列到你的表中,并引用该列而不是@@ROWCOUNT或使用游标。

但是,如果你解释你的最终目标,我们可能会告诉你一个基于集合的方式来实现任何你的目标是没有RBAR处理。