如果数据库位于单个服务器上,您可以从 Management Studio 生成该过程的脚本,并确保使用“检查对象存在”选项(工具 > 选项 > SQL Server 对象资源管理器 > 脚本)。这将产生类似这样的结果(最重要的是,它产生您的存储过程代码作为您可以使用动态 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
或sp_ineachdb
替换的自定义版本:
我曾经为此使用一个名为SQLFarms Combine的工具,但该工具似乎不再存在,或者它可能已被另一家公司吞并/重新命名。Red Gate 此后制作了具有类似功能的SQL Multi Script 。