1

私がいるところでは、メインフレーム システムで実行されているソフトウェア パッケージがあります。メインフレームは、各クライアントがサーバー内に独自のデータベースを持つように、夜間に SQL サーバーにダンプを作成します。サーバー インスタンスには他にもいくつかのデータベースがあり、データのない古いクライアント データベースもいくつかあります。

多くの場合、すべてのクライアントでレポートを実行したり、データを確認したりする必要があります。sp_msforeachdb などを使用してクエリを実行できるようにしたいのですが、リストから不要なデータベースをフィルタリングする方法がわかりません。これがどのように機能するかについて何か考えはありますか?

まだ SQL Server 2000 を使用していますが、数か月以内に 2005 に移行する予定です。


更新:
この質問をするのはうまくいかなかったと思うので、目標を明確にしてから、最終的に使用したソリューションを投稿します。

ここで私が達成したいのは、プログラムで使用するクエリに取り組んでいるプログラマーが、1 つのクライアント データベースを使用してクエリを記述し、1 つのクライアントのデータベースで設計および構築されたコードを 50 のすべてのデータベースでほぼ瞬時に実行 (テスト) できるようにすることです。ほとんど、またはまったく変更を加えずに、クライアント データベースを作成します。

それを念頭に置いて、現在Management Studioにある私のコードは次のとおりです(部分的に難読化されています):

use [master]
declare @sql varchar(3900) 

set @sql = 'complicated sql command added here'

-----------------------------------
declare @cmd1 varchar(100)
declare @cmd2 varchar(4000)
declare @cmd3 varchar(100)
set @cmd1 = 'if ''?'' like ''commonprefix_%'' raiserror (''Starting ?'', 0, 1) with nowait'
set @cmd3 = 'if ''?'' like ''commonprefix_%'' print ''Finished ?'''
set @cmd2 = 
    replace('if ''?'' like ''commonprefix_%'' 
    begin 
        use [?]
        {0} 
    end', '{0}', @sql)

exec sp_msforeachdb @command1 = @cmd1, @command2 = @cmd2, @command3 = @cmd3

これの良いところは、@sql 変数をクエリ テキストに設定するだけでよいことです。ストアド プロシージャに変換するのは非常に簡単です。これは動的SQLですが、繰り返しになりますが、開発にのみ使用されます(有名な最後の言葉;))。欠点は、クエリで使用される一重引用符をエスケープする必要があり、多くの場合、選択リストに余分な''?'' As ClientDB列を追加することになりますが、それ以外は十分に機能します。

今日、別の本当に良いアイデアが得られない限り、これをストアド プロシージャに変換し、一時テーブルを使用してテーブル値関数としてバージョンをまとめて、すべての結果を 1 つの結果セットに入れたいと思います (選択クエリのみ)。

4

4 に答える 4

1

IF NOT IN で実行するステートメントをラップするだけです。

EXEC    sp_msforeachdb  "
IF      '?'     NOT IN ('DBs','to','exclude')   BEGIN
        EXEC    sp_whatever_you_want_to
END
"
于 2009-02-04T17:59:36.220 に答える
0

各データベースサーバーには、このようなメタデータでいっぱいのテーブルを含む「DBA」データベースが含まれています。

「データベース」テーブルは、サーバー上のすべてのデータベースのリストを保持し、データベースのステータス (ライブ、アーカイブ、システムなど) を示すフラグ列を配置できます。

次に、SCRIPT が最初に行うことは、DBA データベースに移動して、実行対象となるすべてのデータベースのリストを取得することです。

サーバー上の物理的なすべてのデータベースが「DBA.databases」テーブルにも入力されていることを確認し、そうでない場合は警告する夜間のメンテナンス スクリプトさえあります。(このテーブルへの行の追加は手動プロセスであるため)

于 2009-02-03T22:32:09.883 に答える
0

sp_msforeachdb の定義を使用して、目的に合わせて微調整してみてはどうでしょうか。定義を取得するには、これを実行します (最初に ctrl-T を押して、結果ペインをテキスト モードにします)。

sp_helptext sp_msforeachdb

明らかに、元の sproc を上書きするのではなく、この sproc の独自のバージョンを作成したいでしょう ;o)

于 2009-02-03T22:36:49.233 に答える
0

2005 SSIS パッケージでは、この種のことを行うのは非常に簡単です。おそらく、どこかのサーバーにインスタンスをセットアップすることができます。

複数のサーバーがセットアップされているため、調査対象のサーバーを示す表があります。次に、とりわけ、すべてのデータベースのリストを取得します。これは、バックアップ スクリプトに使用されます。

このデータベースのリストを維持し、独自の目的のためにいくつかのフィールドを追加できます。レポートするデータベースを決定する方法と、プログラムで実行できるかどうかに応じて、別のパッケージまたはステップを使用できます。

コードはこちらから無料で入手できます: http://www.sqlmag.com/Articles/ArticleID/97840/97840.html?Ad=1

このコードに基づいてシステムを構築しました。

于 2009-02-04T18:00:20.990 に答える