UNION来自多个数据库的表

时间:2014-05-30 14:30:40

标签: sql sql-server tsql sql-server-2005

我有一个MS SQL 2005 (9.0.5000) Server,它有多个名为Mailing_XXXX的数据库,其中XXXX是一个序号。我需要组合来自不同Mailing_XXXX数据库的多个表。问题是我只能通过运行另一个XXXX来确定我想要使用哪个SQL statement

所以如果我运行这个T-SQL语句:

SELECT
    DatabaseName
FROM
    Config.dbo.Template
WHERE
    Name LIKE '%Mailing_%'

它将返回:

DatabaseName
Mailing_2491
Mailing_2663
Mailing_2664
Mailing_2666
Mailing_2667
Mailing_2670

所以我需要创建一个组合表,其中包含每个Mailing_数据库的PrimaryAddress表。

如果我手动编写此代码,我可以轻松完成:

SELECT * FROM Mailing_2491.dbo.PrimaryAddress
UNION ALL
SELECT * FROM Mailing_2663.dbo.PrimaryAddress
UNION ALL
   (etc etc)

但是,我需要每天运行,因为不断添加和删除新邮件。所以我的主要挑战是处理变量Mailing_数字。

2 个答案:

答案 0 :(得分:1)

DECLARE @sql varchar(max) = '';

SELECT @sql = @sql + ' UNION ALL SELECT * FROM ' + QUOTENAME(DatabaseName)
FROM Config.dbo.Template
WHERE Name LIKE '%BLAH%'

SET @sql = STUFF(@sql, 1, LEN(' UNION ALL'), '')
PRINT @sql;

EXEC (@sql);

答案 1 :(得分:0)

这将获取所有数据库并根据您的示例执行语句:

CREATE TABLE #dbs (id INT IDENTITY(1,1), dbname VARCHAR(255))

INSERT INTO #dbs
        ( dbname )
SELECT
    DatabaseName
FROM
    Config.dbo.Template
WHERE
    Name LIKE '%BLAH%'

DECLARE @sql NVARCHAR(MAX)
DECLARE @i INT = 1
DECLARE @dbcount INT

SELECT @dbcount = MAX(id) FROM #dbs

WHILE @i <= @dbcount
    BEGIN
        SELECT @sql = 'SELECT * FROM ' + dbname + ' UNION ALL'
    END

SELECT @sql = LEFT(@sql, LEN(@sql) - 10) --get rid of trailing union all
DROP TABLE #dbs

EXEC sys.sp_executesql @sql

注意从关系数据库的角度来看,让一个数据库包含所有邮件信息以及一个单独的表来区分“邮件号码”会更有意义。