如何使用'使用'命令跨所有数据库执行sql中的某些脚本

时间:2015-12-17 07:49:05

标签: sql sql-server

我有一个脚本需要在SQL Server中的所有数据库中执行。我使用以下逻辑循环遍历除系统数据库之外的所有数据库。

declare @DBName varchar(500)
DECLARE @Database_id  int
DECLARE @Query        varchar(MAX)
select @Database_id = MIN(database_id) from sys.databases where      database_id>4
while @Database_id is not null
begin
select @DBName=name from sys.databases where database_id=@Database_id
set @Query = 'Use'+@DBName 
            --some script
            Print ''+@DBName+''
            exec (@Query)
select @Database_id = MIN(database_id) from sys.databases where  database_id>4 AND database_id>@Database_id 
end

但问题是我无法使用'使用'带变量的命令。有没有其他方法可以使用'使用'命令命中数据库?

我不想使用sp_MSforeachdb命令,因为我的查询太长了。 任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

这样做有一个无证件的功能。您可以在db的名称中使用问号:

EXECUTE master.sys.sp_MSforeachdb 'USE [?]; EXEC sp_spaceused'

在此处查找此示例和更多说明:http://weblogs.sqlteam.com/joew/archive/2008/08/27/60700.aspx

编辑:从上面的评论中我发现,您不希望将系统dbs包含在您的运行中。看起来有点棘手,无论db是否是系统db,你都可以这样:

DECLARE @cmd VARCHAR(1000)='USE [?];IF DB_ID(DB_NAME())<=4 RETURN;EXEC sp_spaceused;'
EXECUTE master.sys.sp_MSforeachdb @cmd;
GO

了解这里的缺陷(关于SQL Server 2005!):SQL Server: How to tell if a database is a system database?

如果你不喜欢这个<=4,你可以像

一样
IF DB_NAME() IN('master','model',... any more names here ... ) RETURN;

我所知道的唯一真正限制是,sp_MSforeachdb不喜欢&#34; GO&#34;。