SQL Server 2008 - 相同的查询,相同的服务器实例,具有相同表的多个数据库

时间:2014-07-26 17:03:07

标签: sql-server sql-server-2008

我有1个SQL Server 2008实例,其中包含多个相同的数据库。 我希望在所有数据库上运行相同的查询(例如:向表中添加列)。 我希望使用包含数据库名称的数组。

如何在SQL Server中执行此操作?

感谢您的帮助

3 个答案:

答案 0 :(得分:0)

您可以通过查询sys.databases获取所有数据库,然后在游标上使用动态sql语句,并使用当前值(即数据库名称)适当限定的select语句。

这是一个示例脚本,它将输出名称以“commerce”结尾的数据库的结果。修改它以插入临时表而不是选择

将是微不足道的
DECLARE DBS CURSOR FOR
    SELECT name
    FROM sys.databases 
    WHERE name like '%Commerce'

DECLARE @DB SYSNAME

OPEN DBS

FETCH NEXT FROM DBS INTO @DB

WHILE @@FETCH_STATUS = 0
BEGIN
    DECLARE @SQL NVARCHAR(MAX)
    SET @SQL = 'SELECT TOP 1 DB_NAME(), * FROM ' + @DB + '.dbo.dbversion ORDER BY ExecutionDate desc'
    exec(  @sql )

    FETCH NEXT FROM DBS INTO @DB
END

CLOSE  DBS
DEALLOCATE DBS 

答案 1 :(得分:0)

EXEC sp_MSforeachdb @command

它没有记录,命令将需要检查它正在处​​理哪个数据库以排除那些你不想要的数据

答案 2 :(得分:0)

只需使用语法[dbname]。[schema]。[tablename]

,就可以跨多个数据库运行SQL。

因此,您可以轻松地将动态SQL写入INSERT INTO [dbname]。[dbo]。[TableName],无论您想要什么。

您甚至可以使用此语法编写一个SQL查询来连接来自两个不同数据库的表。

在您的情况下,只需在字符串中构建SQL语句,然后调用EXEC执行它。您可以在顶部声明一个表变量并将数据库的名称插入其中,并在SQL查询中使用它来构建SQL字符串。或者使用适当的WHERE子句查询sys.databases以获取数据库名称。然后使用这些值为每个数据库构建和执行适当的SQL。