Как получить данные из нескольких баз?

Имеется N баз данных с одинаковой схемой и табличка, в которой хранятся имена баз данных. По особому критерию я выбираю все нужные мне имена баз. Затем мне необходимо применить запрос к каждой базе из полученного на предыдущем шаге списка, а все результаты объединить в одну таблицу. Подскажите, каким образом это сделать? Вручную это бы выглядело как–то так

SELECT Cnt, DBName
FROM
(
    SELECT 
      COUNT(*), 'MyDB1'
    FROM 
      MyDB1.dbo.Files
    UNION ALL
    (
        SELECT 
          COUNT(*), 'MyDB2'
        FROM 
          MyDB2.dbo.Files
    ) UNION ALL
    (
        SELECT 
          COUNT(*), 'MyDB3'
        FROM 
          MyDB3.dbo.Files
    ) UNION ALL
) X;

Как получить тоже самое, если имена базы данных выбираются из мета-таблицы?


Ответы (1 шт):

Автор решения: Aziz Umarov

Что-то такое

DECLARE MyCursor CURSOR FOR -- курсор для получения данных
SELECT 
    DB_NAME(t.db_id) DBname
    , SCHEMA_NAME(t.schema_id) Schemaname
    , t.name AS TableName
FROM  ... ваши источники и условия

OPEN MyCursor

DECLARE @DB VARCHAR(100),  @Schema VARCHAR(100), @Table VARCHAR(100)
DECLARE @sql NVARCHAR(MAX)=''


FETCH FROM MyCursor INTO @DB, @Schema, @Table -- формируем запрос
WHILE @@FETCH_STATUS=0    
BEGIN   
    SET @SQL = CASE WHEN @SQL <> '' THEN ' UNION ALL ' ELSE '' END + 'SELECT COUNT(*), ''' + @SCHEMA + ''' FROM ' + @Db + '.' + @SCHEMA + '.' + @TABLE   
END

CLOSE MyCursor
DEALLOCATE MyCursor

exec sp_executesql @sql

Updated.

CASE WHEN @SQL <> '' THEN ' UNION ALL ' ELSE '' END

Вы в цикле курсора формируете запрос. На случай когда @SQL пустой UNION ALL не нужен.

→ Ссылка