カーソルは本当に「正しい」選択ですか?

時には、データを処理するときに手続き型プログラミングが絶対に避けられない場合もあります。

私は現在、いくつかのレガシーコードの最適化に取り組んでいます。それはカーソル、 IF / ELSE ステートメントと BEGIN / END カーソルをリバースエンジニアリングして手続きプロセスにすることを望んでいました。今私はアルゴリズムの解読の最後にあり、実現しています。 。 。 ooops ...レコードについた各選択は、前のすべてのレコードのプロセスの結果に依存するため、プロシージャであることが持っています

だから私は破れている... SQL Serverの処理(CLRのSP、UDFのなど)でプロシージャコードを混合するための他の選択肢があります。私は仕事のための適切なツールを使用することを大いに信じているので、私はこれのために.NET CLR SPを作ることに傾いています。しかし、カーソルを単純化するだけで、カーソルを保持することは、より速く簡単に行えます。

あなたはどう思いますか? SQL Serverを使用して.NETモジュールにアクセスできるようになったので、カーソルを使用することはもう適切ではありませんか?

0

2 答え

SQLサーバーでは、少なくともグローバル一時表と表変数の両方を持つWHOWでは、サーバー側のカーソルを使用するシナリオを想像することはできません。従来のアプリで発見したように、すべてのコードを設定ベースにすることはできませんが、手続き的にレコードを反復処理する必要がある場合でも、カーソルは最悪の選択肢です。

例えばテーブル変数を使用して、 (そして、このアプローチは非常に大きなテーブルセットのパフォーマンスが低下し始めます)

 Declare @Pks Table (pk integer primary key not null)
 Insert @pks(pk)
 Select pkcolName from table where ... [here put logic to 
           extract id values for rows you need to iterate over

 -- then put procedural code here ...
 Declare @pk Integer
 While Exists (Select * From @pks) Begin
     Select @pk = Max(pk) From @pks -- assuming you need to work 
                             -- on pk values from highest to lowest
    //Here do work on one record at a time, using value in @pk
     Delete @pks Where pk = @pk
 End
2
追加された
カーソル以外の手続きを反復する場合は、どのようなことをお勧めしますか?そして、いいえ、これは手続き的でなければなりません。私はこれについて多くのことを考え、それを切り裂き、セットベースで行う方法はありません。
追加された 著者 richard,
例を追加する
追加された 著者 Charles Bretana,
私は完全にはわかりませんが、私は、前向きに読んでいるカーソルだけを比較する唯一のタイプのカーソルは、間違いなくサーバ側のカーソルではなく、上記のコードの構文表現であると考えています。それを直接行うことがあなたに与えるコントロールなしで。
追加された 著者 Charles Bretana,

私はC#でクライアント/アプリケーションサーバー上のループを実行し、必要に応じてストアドプロシージャを呼び出します。通常、C#は開発や単体テストの方がはるかに高速で簡単ですが、CLRを使用してもデータベース内のすべての処理を行うストアドプロシージャよりも高速に実行できます。

0
追加された