2012-03-30 1 views
2

これは正常であるはずで、時間の80%で動作しますが、残りの20%は正常終了し、明白な理由がないデータベースの一覧:カーソル内のsys.databasesはデータベースをスキップします

DECLARE c_UserDatabases CURSOR FOR 
    SELECT Name 
    FROM Sys.Databases SD (NOLOCK) 
    ORDER BY Name 

OPEN c_UserDatabases 
FETCH Next FROM c_UserDatabases INTO @v_DatabaseName 
WHILE @@FETCH_STATUS = 0 
    BEGIN 
     -- Query that takes a few minutes to run (using dynamic SQL and EXEC, etc) 
     FETCH Next FROM c_UserDatabases INTO @v_DatabaseName 
    END 

CLOSE c_UserDatabases 
DEALLOCATE c_UserDatabases 

これはSQL Server 2008 SP3上です。私はあなたが名前で注文しなかった場合、それはいくつかのバージョンでiffyであることを言及した記事に気づいたが、この失敗条件を示すものは何もない。私は内部セクションが実行に時間がかかりすぎることがあるので、まれな状況にあるかもしれないと思いますか?

誰かがこれを見ているかどうか知りたいです。私はそれを代わりに一時テーブルとカーソルに選択するために書き直すことを計画しています。

+1

なぜSYS.DATABASESでNOLOCKを使用していますか? –

+0

私はコードを書かなかった。しかし、ユーザー/ログインテーブルの長時間実行されているカーソルが長い実行中にログインを妨げていて、それがセーフガードとして追加された可能性があるという問題を耳にしましたか?なぜ聞くのですか。 –

答えて

2

これは私の本当に古い質問ですが、答えは、あなたがSys.Databasesを反復している場合は、あなたのカーソルタイプがSTATICでなければならないことでした。

そうしないと、テーブルを反復している間にテーブルに何か問題が発生した場合(バックアップなど)、データベースをスキップできます。 sp_MSForeachDBと同じです。

ありがたいことに、ずっと前にこのビットを過ぎて移動しました。そしてええ、NOLOCKが取り出されました。

1

文書化されていませんが、sp_MSForeachDBはすべてのDBに対してクエリを実行する優れた方法を提供します。このアプローチは役に立ちますか?

EXEC sp_MSForeachDB ' 
    SELECT * FROM [?].sys.tables 
' 
関連する問題