2017-01-11 29 views
0

ローカルカーソルを使用してproductaggという名前のテーブルの各レコードを反復処理し、レコードに固有のさまざまな操作を実行するストアドプロシージャをリファクタリングしています(s)をそのテーブルに追加します。SQL:@@ fetch_status = -1の場合にwhileループを追加する方法

このループは、テーブルにレコードが存在する限り実行され、-1以外のステータスを返します。

ループの内側または外側のどちらかで、productaggテーブルにレコードがない場合と同じ操作を実行する必要があるシナリオを追加する必要があります。その場合は、すべての製品に対して操作を実行したいだけです。ここ

は、ストアドプロシージャの基本的な、現在の構造である:productaggで指定されていない製品がなかったかのように

DECLARE productagg_cursor CURSOR LOCAL 
FOR SELECT      
    [ProductID] 
    ,[MaxItems] 
    ,[RegionID]       
    FROM [dbo].[ProductAgg] 
    WHERE [ProductAggID] IS NOT NULL; 

OPEN productagg_cursor;  

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; -- TURN IT ON 

FETCH NEXT FROM productagg_cursor 
INTO 
     @ProductAggID 
,  @MaxItems 
,  @RegionID; 

WHILE @@FETCH_STATUS <> -1 


    In here the operations based on the record that set the cursor id value happen. 



    FETCH NEXT FROM productagg_cursor INTO 
      @ProductAggID 
    ,  @MaxItems 
    ,  @RegionID; 

END; -- END WHILE 

SET TRANSACTION ISOLATION LEVEL READ COMMITTED; -- TURN IT OFF 

CLOSE productagg_cursor; 

DEALLOCATE productagg_cursor; 

私の要求は、productaggidに基づいて同じ操作を実行することです表。この操作は、productaggテーブルだけでなく、すべてのプロダクトに対して実行されます。

この部分は、productaggテーブルからの戻り値が> 0であるかどうかをチェックするIf文として追加されます。そうであれば、カーソルおよびwhileループを含むすべてのものを実行し、反対の場合は実行しますもう?それともこれができるのか?どんなアイデアや例も非常に高く評価されます。

ありがとうございます。

+1

これは、カーソルをリファクタリングすることを検討するのに適しているかもしれません。そうしている間は、コミットされていない読み取りの使用をやめるのがよいでしょう。あなたは本当に分離レベルについてもっと読むべきです。あなたが更新を行っているときには、read uncommittedは非常に悪いです。 http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/ –

答えて

0

このようなコードはどこにありますか?

if @@FETCH_STATUS = -1 
begin 
    print 'No Rows' 
end 
else while @@FETCH_STATUS <> -1 
begin 
    print 'Rows' 
    -- fetch next 
end 

これと同じコードブロックが関係なく実行されますか?

関連する問題