2012-01-26 211 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處理。