查询跨不同的数据库 - 相同的表SQL Server 2012

时间:2015-05-17 13:39:53

标签: sql sql-server

我在不同服务器上的大约200个不同数据库中有一个公共表“User Activity”,是否可以在一个语句中从该表的所有数据库中选择行?

我有一个列在主数据库/表中的数据库和服务器,可以通过 从CustomersList

中选择DBases中的servername,dbname

3 个答案:

答案 0 :(得分:5)

是的,但你需要明确地提及它们:

SELECT COl1,Col2,Col3 FROM Database1.schema.Table1
UNION ALL
SELECT COl1,Col2,Col3 FROM Database2.schema.Table1
UNION ALL
SELECT COl1,Col2,Col3 FROM Database3.schema.Table1
UNION ALL
.......
...
SELECT COl1,Col2,Col3 FROM Database200.schema.Table1

这是我在Excel中构建并粘贴到SSMS中的那种东西。

然后你可能想重新考虑在200个数据库中设置它是否是一个好的设计。

答案 1 :(得分:1)

我建议您使用以下语法:

DECLARE @tableName nvarchar(256) = 'Table1'
DECLARE @sql nvarchar(max) = ''

SELECT @sql = @sql + CASE WHEN @sql <> '' THEN 'UNION ALL ' ELSE '' END 
                   + 'SELECT * FROM [' + dbs.name + ']..[' + @tableName + '] '
FROM sys.sysdatabases dbs
WHERE dbs.name NOT IN ('master', 'tempdb', 'msdb', 'model')

EXEC(@sql)

您可以轻松优化它以在存储过程中使用。

答案 2 :(得分:1)

我收到此错误:

'ALL'附近的语法不正确

我尝试运行你的代码。

我在两个数据库中有地址表,因此我将代码修改为:

 DECLARE @tableName nvarchar(256) = 'dbo.Address'

 DECLARE @sql nvarchar(max) = ''

 SELECT @sql = @sql + 'SELECT * FROM [' + dbs.name + ']..[' + @tableName +        '] ' 
               + CASE WHEN @sql <> '' THEN 'UNION ALL ' ELSE '' END
 FROM sys.sysdatabases dbs where dbs.dbid in (7,8)

 and dbs.name NOT IN ('master', 'tempdb', 'msdb', 'model','SSISall')

 EXEC(@sql)