Различное объединение SQL с числом баз данных - PullRequest
0 голосов
/ 22 мая 2019

Может показаться глупым, но я все еще работаю через SQL, и я достиг своего ограничения на то, что я могу выписать.

Вот сценарий: у меня много SQL-серверов с несколькими базами данных.Мне нужно выполнить поиск в каждой базе данных, и, если таблица есть, вернуть результаты, затем объединить эти результаты вместе со вторичной базой данных.

Мне также нужно имя базы данных, в которой находится каждая из этих таблиц.

Запрос № 1, который возвращает важные данные

SELECT DISTINCT 
    datafeed_id AS 'Datafeed ID', 
    MAX(start_time) AS 'Start Time', 
    MAX(end_time) AS 'End Time', 
    MAX(status_id) AS 'Status',
    MAX(DATEDIFF(mi, [start_time], [end_time])) AS 'Run Time'
FROM 
    dbo.tblDataFeedHistory
GROUP BY
    datafeed_id

Запрос № 2, который возвращает информацию Supporting Query1, которая мне нужна.Заметьте, что здесь я вызывал каждую базу данных отдельно, но там могло быть n баз данных

CREATE OR ALTER VIEW [vAllDatabasesDataFeedResult] 
AS
    SELECT
        Name = 'Instance',
        [datafeed_name], [status], [is_active]
    FROM 
        instance.dbo.tblDatafeed

    UNION ALL

    SELECT
        Name = 'Instance1',
        [datafeed_name], [status], [is_active] 
    FROM
        Instance2.dbo.tblDataFeed;

Что бы я хотел видеть в результате вывода ВСЕХ баз данных в SQL, если они содержат таблицу dbo.tblDataFeed

| Database Name | Datafeed_name | Is_active | Status | Start_time | End_Time | Status_id | Runtime

Я бы предпочел, чтобы он возвращал результаты, создавая новое представление.

Заранее спасибо

1 Ответ

0 голосов
/ 22 мая 2019

Вы можете использовать sp_MSForEachDB.Например, ниже, у меня есть, возможно, 10 баз данных.У двух из них есть моя повторяющаяся таблица "LogEntry".Если бы я хотел получить количество строк в базе данных, я мог бы использовать следующее.

ПРИМЕЧАНИЕ. Я должен проверить «если существует» в таблице, иначе запрос не будет выполнен в базах данных без таблицы.

Вместо SELECT я мог бы также перенести свои подсчеты в совокупную базу данных / таблицу / столбец (столбцы).

Вы можете делать что угодно, ключом является вызов sp_MSForEachDB.

EXECUTE sp_MSForEachDB 
        'USE ?;         IF (EXISTS (SELECT * 
                 FROM INFORMATION_SCHEMA.TABLES 
                 WHERE TABLE_SCHEMA = ''dbo''
                 AND  TABLE_NAME = ''LogEntry''))
BEGIN
    Select DB_NAME() AS DBName , COUNT(*) from dbo.LogEntry
END'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...