5

いくつかのカーソルを作成して開くストアド プロシージャがあります。最後にそれらを閉じますが、エラーが発生した場合、それらのカーソルは開いたままになります! その後、カーソルを作成しようとすると、その名前のカーソルが既に存在するため、後続の実行は失敗します。

どのカーソルが存在するか、それらが開いているかどうかを照会して、それらを閉じて割り当てを解除できる方法はありますか? これは、やみくもにエラーを閉じて飲み込もうとするよりも優れていると思います。

4

5 に答える 5

2

これは私にとってはうまくいくようです:

CREATE PROCEDURE dbo.p_cleanUpCursor @cursorName varchar(255) AS
BEGIN

    DECLARE @cursorStatus int
    SET @cursorStatus =  (SELECT cursor_status('global',@cursorName))

    DECLARE @sql varchar(255)
    SET @sql = ''

    IF @cursorStatus > 0
        SET @sql = 'CLOSE '+@cursorName

    IF @cursorStatus > -3
        SET @sql = @sql+' DEALLOCATE '+@cursorName

    IF @sql <> ''
        exec(@sql)

END
于 2008-11-10T15:19:50.177 に答える
2

カーソルの検索方法については、こちらをご覧ください。Row By Agonizing Rowを実行せずにそれを実行する方法を見つけることができたので、私はそれらのいずれも使用したことがありません。

spを次のいずれかに再構築する必要があります

  • カーソルを使用しないでください(私たちがお手伝いできます-ほとんどの場合、RBARを回避する方法があります)

  • トランザクションでビルドし、障害が発生した場合、またはエラーを検出した場合はロールバックします。これに関するいくつかの優れた記事があります。パート1パート2

SQL2005を使用している場合は、trycatchを使用することもできます

編集(あなたの投稿に応じて):理想的には、データ生成は、非セットベースの操作に適しているため、アプリケーションレベルで処理するのが最適です。

Red Gateには、以前に使用したSQLデータジェネレーターがあります(単一のテーブルには最適ですが、FKが多い場合や[正規化された]データベースが広い場合は、いくつかの構成が必要です)。

于 2008-11-05T16:10:11.277 に答える
0

sp_cursor_listシステム ストアド プロシージャを 使用して、現在の接続で表示されるカーソルのリストを取得したり、 sp_describe_cursorsp_describe_cursor_columns、および sp_describe_cursor_tablesを使用してカーソルの特性を判断したりできます。

( http://msdn.microsoft.com/it-it/library/aa172595(v=sql.80).aspxから)

于 2013-01-15T13:03:28.867 に答える