2013-07-30 6 views
2

Скажет, у меня есть следующие базы данных в 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 для каждого.

Может ли кто-нибудь дать мне сценарий для этого? Я могу изменить скрипт, чтобы самостоятельно исключать системные базы данных.

Благодаря

+1

Что делать, если ваши базы данных называются fred, barney, Wilma и т. д.? –

ответ

5

Если вы знаете точное количество DBS:

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; 
Смежные вопросы