私がいるところでは、メインフレーム システムで実行されているソフトウェア パッケージがあります。メインフレームは、各クライアントがサーバー内に独自のデータベースを持つように、夜間に 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 つの結果セットに入れたいと思います (選択クエリのみ)。