いくつかのカーソルを作成して開くストアド プロシージャがあります。最後にそれらを閉じますが、エラーが発生した場合、それらのカーソルは開いたままになります! その後、カーソルを作成しようとすると、その名前のカーソルが既に存在するため、後続の実行は失敗します。
どのカーソルが存在するか、それらが開いているかどうかを照会して、それらを閉じて割り当てを解除できる方法はありますか? これは、やみくもにエラーを閉じて飲み込もうとするよりも優れていると思います。
いくつかのカーソルを作成して開くストアド プロシージャがあります。最後にそれらを閉じますが、エラーが発生した場合、それらのカーソルは開いたままになります! その後、カーソルを作成しようとすると、その名前のカーソルが既に存在するため、後続の実行は失敗します。
どのカーソルが存在するか、それらが開いているかどうかを照会して、それらを閉じて割り当てを解除できる方法はありますか? これは、やみくもにエラーを閉じて飲み込もうとするよりも優れていると思います。
これは私にとってはうまくいくようです:
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
カーソルの検索方法については、こちらをご覧ください。Row By Agonizing Rowを実行せずにそれを実行する方法を見つけることができたので、私はそれらのいずれも使用したことがありません。
spを次のいずれかに再構築する必要があります
カーソルを使用しないでください(私たちがお手伝いできます-ほとんどの場合、RBARを回避する方法があります)
トランザクションでビルドし、障害が発生した場合、またはエラーを検出した場合はロールバックします。これに関するいくつかの優れた記事があります。パート1とパート2
SQL2005を使用している場合は、trycatchを使用することもできます。
編集(あなたの投稿に応じて):理想的には、データ生成は、非セットベースの操作に適しているため、アプリケーションレベルで処理するのが最適です。
Red Gateには、以前に使用したSQLデータジェネレーターがあります(単一のテーブルには最適ですが、FKが多い場合や[正規化された]データベースが広い場合は、いくつかの構成が必要です)。
sp_cursor_listシステム ストアド プロシージャを 使用して、現在の接続で表示されるカーソルのリストを取得したり、 sp_describe_cursor、sp_describe_cursor_columns、および sp_describe_cursor_tablesを使用してカーソルの特性を判断したりできます。
( http://msdn.microsoft.com/it-it/library/aa172595(v=sql.80).aspxから)