データベースが単一のサーバー上にある場合は、Management Studioからプロシージャのスクリプトを生成し、[オブジェクトの存在を確認する]オプション([ツール]>[オプション]>[SQLServerオブジェクトエクスプローラー]>[スクリプト])を必ず使用してください。これにより、次のような結果が得られます(最も重要なのは、動的SQLを使用して実行できるものとしてストアドプロシージャコードを生成することです)。
USE DBName;
GO
SET ANSI_NULLS ON;
GO
SET QUOTED_IDENTIFIER ON;
GO
IF NOT EXISTS (...)
BEGIN
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE dbo.whatever ...
'
END
GO
このスクリプトができたので、複数のデータベースで機能するようにスクリプトを変更できます。@ statement =の部分をスワイプして、再利用するだけです。まず、これを機能させたいデータベースを@table変数に詰め込む必要があります(または、必要に応じて、これを永続テーブルに配置できます)。次に、各データベースで実行するコマンドを作成できます。
DECLARE @dbs TABLE (name SYSNAME);
INSERT @dbs(name) SELECT N'db1';
INSERT @dbs(name) SELECT N'db2';
INSERT @dbs(name) SELECT N'db3';
-- now here is where we re-use the create / alter procedure command from above:
DECLARE @statement NVARCHAR(MAX) = N'CREATE PROCEDURE dbo.whatever ...
';
-- now let's build some dynamic SQL and run it!
DECLARE @sql NVARCHAR(MAX);
SET @sql = N'';
SELECT @sql = @sql + '
EXEC ' + QUOTENAME(name) + '.dbo.sp_executesql N''' + @statement + ''';'
FROM @dbs;
EXEC sys.sp_executesql @sql;
sp_msforeachdb
または、myまたはsp_ineachdb
replacementsのカスタムバージョンを作成することもできます。
以前はSQLFarmsCombineというツールを使用していましたが、ツールが存在しないか、他社に飲み込まれたり、ブランドが変更されたりした可能性があります。その後、 RedGateは同様の機能を持つSQLマルチスクリプトを作成しました。