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

问题描述 投票:5回答:3

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

我有一个主数据库/表中的数据库和服务器列表,可以通过客户列表中的数据库选择servername,dbname获取

sql sql-server
3个回答
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
投票

我收到此错误:

'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)

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)

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

© www.soinside.com 2019 - 2024. All rights reserved.