Как получить данные из нескольких баз?
Имеется 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 не нужен.