1

ストアド プロシージャがあります。その一部は、内部結合を持つ 6 つの異なるテーブルを含む select ステートメントに対してカーソルを実行しています。

カーソル本体では、カーソルからのパラメーターを使用して、他の 3 つのストアド プロシージャを実行します。

この状況でカーソルを取り除く方法はありますか?

皆さんありがとう!

  DECLARE myCursor CURSOR FOR
              SELECT x,y,z
              FROM   a
                     INNER JOIN .....
                     INNER JOIN .....
                     INNER JOIN .....
                     INNER JOIN .....
                     INNER JOIN .....

            OPEN myCursor

            FETCH NEXT ...

            WHILE @@FETCH_STATUS = 0
              BEGIN

                    EXECUTE xy @cursor_variable

                    EXECUTE yz @cursor_variable

                    EXECUTE abc @cursor_variable

                  FETCH NEXT FROM myCursor INTO ...
              END

            CLOSE myCursor

            DEALLOCATE myCursor
        END
4

3 に答える 3

1

ロックを保持しない静的カーソルを試してください。

于 2013-05-18T05:03:27.730 に答える
1

あなたがしたいと思うかもしれないことは、結合を一時テーブルに選択し、それをカーソルで使用することです。少なくとも、ベース テーブルは解放されます。

于 2013-05-17T16:36:16.807 に答える
0

デッドロックを防ぐのに役立つ一部のデータで使用するカーソルは次のとおりです。

declare cursor YOURCURSORNAME cursor local static read_only forward_only for  

ただし、特に同時カーソルが同じテーブルをクエリする場合は、クエリを実行してもテーブルがロックされる可能性があるため、デッドロックを防ぐのにこれが常に効果的であるとは限りません。

@JeffBが推奨するのは、データを一時テーブルにコピーすることです。

または、クエリを実行する各テーブルで (nolock) を使用するか、クエリの先頭に次のフラグを設定することで、シナリオでダーティ リードを実行できる場合は、ダーティ リードを実行できます。

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
于 2016-12-02T08:30:09.260 に答える