3

假设我在 SQL Server 2008 R2 中有以下数据库

db1, db2, db3, db4, db5......dbn

每个数据库都有一个A包含列的表C1,C2,C3

Select我可以在两个数据库上编写以下语句来获取它们之间的数据:

Select C1,C2,C3
FROM db1.dbo.A

UNION ALL

Select C1,C2,C3
FROM db2.dbo.A

但是,如果我在同一台服务器上有 50 个数据库,我不想UNION ALL为每个数据库编写一个。

有人可以给我一个脚本来做到这一点吗?我可以自己修改脚本以排除系统数据库。

谢谢

4

1 回答 1

6

如果您知道确切的 DB 数量:

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += N'
UNION ALL
  SELECT C1,C2,C3
  FROM db' + CONVERT(VARCHAR(2), n) + '.dbo.A'
FROM 
(
  SELECT TOP (50) n = ROW_NUMBER() 
  OVER (ORDER BY [object_id])
  FROM sys.all_columns
) AS x;

SET @sql = STUFF(@sql, 1, 11, '') + ';';

PRINT @sql;
--EXEC sp_executesql @sql;

如果您不知道正好有 50 个,那么这可能会更好(它还允许您排除那些不在线的):

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += N'
UNION ALL
  SELECT C1,C2,C3
  FROM ' + QUOTENAME(name) + '.dbo.A'
FROM sys.databases
WHERE state = 0
AND name LIKE N'db[0-9]%';

SET @sql = STUFF(@sql, 1, 11, '') + ';';

PRINT @sql;
--EXEC sp_executesql @sql;
于 2013-07-30T19:31:31.657 回答