2012-05-10 24 views
0
declare @i int 
declare @skool float 

declare schoolCursor cursor for 
select distinct choice from tempstuas 

open schoolCursor 
fetch next from schoolCursor into @skool 
while @@fetch_status = 0 
begin 
     while @i < 20 
      begin 
       update top(1) tempstuas set [email protected] where cnt = '' and cat = 1 and [email protected] 
       update top(1) tempstuas set [email protected] where cnt = '' and cat = 2 and [email protected] 
       update top(1) tempstuas set [email protected] where cnt = '' and cat=3 and [email protected] 

       set @i = @i + 1 
      end 
     fetch next from schoolCursor 
end 
close schoolCursor 
deallocate schoolCursor 

これは基本的に個々の場所番号を返すカーソルを介して行われます。ロケーション番号は、特定の時間(20)を繰り返すwhileループ内で使用する必要があるカーソルからの変数として格納されます。私が返すのは、位置番号のリスト全体に対してカーソルが移動しているだけですが、更新ステートメントでwhileループを繰り返すわけではありません。A Whileループwhileループwhileループ - SQL

+2

1を参照してください20

<ではありません。 'WHILE'ステートメントの直前に' SET @i = 1'(または0、または必要なもの)を挿入しますか? 2)。カーソルとWhileループを使用せずにこれを行う方法を見つける。 – MatBailie

答えて

2

カーソルとループは一般的に問題を解決するには間違った方法ですが、私はセットベースのソリューションを提案するために何をしているのかはまだ分かりませんが、真剣に考えてみてください思考ループを止める。

あなたの問題は、@iがNULLであることをヌルであるが)は私の理論の本試験

declare @i int 

if @i<20 print'hi' 
else print 'bye' 
+0

HLGEMが点在しています。 i変数を初期化します。しかし、行のアプローチ(RBAR)を苦労させることによって行から離れて移動してください。カーソルは非常に頻繁にパフォーマンスのキラーです。 – Namphibian

+0

i、i = 0を初期化することは、これを反復処理するための解決策でした。理論やリンクを設定するための推奨はありますか?あなたの助けと迅速な対応に感謝します。 – central

+0

ここは開始場所です:http://wiki.lessthandot.com/index.php/Cursors_and_How_to_Avoid_Them – HLGEM