首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从多个数据库合并一个表

从多个数据库合并一个表
EN

Stack Overflow用户
提问于 2014-05-30 14:30:39
回答 2查看 261关注 0票数 0

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

因此,如果我运行这个T-SQL语句:

代码语言:javascript
复制
SELECT
    DatabaseName
FROM
    Config.dbo.Template
WHERE
    Name LIKE '%Mailing_%'

它将返回:

代码语言:javascript
复制
DatabaseName
Mailing_2491
Mailing_2663
Mailing_2664
Mailing_2666
Mailing_2667
Mailing_2670

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

如果我手动编写这段代码,我可以很容易地做到:

代码语言:javascript
复制
SELECT * FROM Mailing_2491.dbo.PrimaryAddress
UNION ALL
SELECT * FROM Mailing_2663.dbo.PrimaryAddress
UNION ALL
   (etc etc)

然而,我需要这每天运行,因为新的邮件将不断被添加和删除。因此,我面临的主要挑战是如何处理变量Mailing_数。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-30 14:39:25

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2014-05-30 14:40:27

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

代码语言:javascript
复制
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

从关系数据库的角度来看,拥有一个包含所有邮件信息的数据库和一个单独的表来区分“邮件号”将更有意义。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23957037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档