我在不同服务器上的大约200个不同数据库中有一个公共表“User Activity”,是否可以在一个语句中从该表的所有数据库中选择行?
我有一个列在主数据库/表中的数据库和服务器,可以通过 从CustomersList
中选择DBases中的servername,dbname答案 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)