【问题标题】:Dynamic query to Union multiple databases联合多个数据库的动态查询
【发布时间】:2013-07-31 02:34:55
【问题描述】:

假设我在 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

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

谢谢

【问题讨论】:

  • 如果您的数据库名为 fred、barney、Wilma 等会怎样?

标签: sql sql-server-2008-r2 dynamic-sql


【解决方案1】:

如果您知道确切的 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;

【讨论】:

    猜你喜欢
    • 2022-12-10
    • 2017-05-06
    • 2015-04-18
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    • 1970-01-01
    • 2019-12-04
    • 1970-01-01
    相关资源
    最近更新 更多