我在不同服务器上的大约200个不同的数据库中有一个公共表“User Activity”,是否可以在一个语句中从该表的所有数据库中选择行?
我有一个主数据库/表中的数据库和服务器列表,可以通过客户列表中的数据库选择servername,dbname获取
是的,但你需要明确地提及它们:
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个数据库中使用它是否是一个好的设计。
我收到此错误:
'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)
我建议你使用这个语法:
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)
您可以轻松地优化它以在存储过程中使用。