我有一个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_
数字。
答案 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
注意从关系数据库的角度来看,让一个数据库包含所有邮件信息以及一个单独的表来区分“邮件号码”会更有意义。