Запуск SQL-запроса в нескольких базах данных

Я хочу запустить запрос по нескольким базам данных. Я видел эту функцию;

sp_MsForEachDb

Это нормально, но он работает со всеми базами данных, и я хочу использовать только некоторые из них. Есть ли способ выбрать, какие базы данных запускать? Также в этих базах данных у нас есть ветки (поэтому все таблицы имеют столбец BranchID). Например, база данных 1 может иметь ветви 4, 5 и 6, а нам нужна только ветвь 5. База данных 2 также может иметь ветви 4, 5 и 6, но в этой базе данных нам нужны ветви 4 и 5. Есть ли способ выбрать, какие ветка запускается в соответствии с какой базой данных запускается?

Можно ли это сделать в SSIS или чем-то подобном?

Надеюсь, это имеет смысл!


person Becky    schedule 07.12.2015    source источник
comment
Я бы предположил выбор из sys.databases, а также где в заявлении для ветвей.   -  person evictednoise    schedule 07.12.2015
comment
Как вы используете sys.databases? Я не делал этого раньше...   -  person Becky    schedule 07.12.2015
comment
это представление в базе данных сервера sql, которое содержит информацию о базе данных. просто попробуйте select * from sys.databases. Также msdn msdn.microsoft.com/en-us/library/ms178534.aspx< /а>   -  person evictednoise    schedule 07.12.2015
comment
оттуда вы можете получить db_id, имена и т.д., а также другую информацию, которая может оказаться полезной.   -  person evictednoise    schedule 07.12.2015


Ответы (1)


Для этого я использую простой курсор... это довольно прямолинейно, и вы можете запустить любой оператор внутри него по списку баз данных.

    --Drop temporary tables if they already exists.
IF OBJECT_ID('tempdb..#DatabaseNames') IS NOT NULL
    DROP TABLE #DatabaseNames

IF OBJECT_ID('tempdb..#Results') IS NOT NULL
    DROP TABLE #Results

--Create a temporary table.
CREATE TABLE #DatabaseNames
(
    DBName varchar(100),
    Active bit
)

GO

--Create a temporary table to store results.
CREATE TABLE #Results
(
    FirstName varchar(100),
    WebLogin varchar(100)
)

GO

--It's the long way to do this but just showing for the sake of the example.
INSERT INTO #DatabaseNames
VALUES ('Database1', 1)

INSERT INTO #DatabaseNames
VALUES ('Database2', 0)

INSERT INTO #DatabaseNames
VALUES ('Database3', 1)

INSERT INTO #DatabaseNames
VALUES ('TIER1', 1)

INSERT INTO #DatabaseNames
VALUES ('Northwind', 1)

DECLARE @DBName varchar(20)
DECLARE @SQL   varchar(2000)

--Start cursor
DECLARE LoopCursor CURSOR FOR
    SELECT DBName AS 'DBName'
    FROM #DatabaseNames
    WHERE DBName NOT IN ('TIER1', 'Northwind')
    AND Active = 1

    OPEN LoopCursor

    FETCH NEXT FROM LoopCursor
    INTO @DBName

    WHILE @@FETCH_STATUS = 0
    BEGIN

        SET @SQL = '
        INSERT INTO #Results
        SELECT FirstName, WebLogin
        FROM ' + @DBName + '.dbo.Users
        WHERE FirstName = ''User1''
        AND LastName = ''User1''
        AND WebLogin = ''User1Login'''

        EXEC(@SQL)
        --Print @DBName

        FETCH NEXT FROM LoopCursor
        INTO @DBName
    END

    SELECT *
    FROM #Results

    CLOSE LoopCursor
    DEALLOCATE LoopCursor

Я снова изменил свой ответ, чтобы он соответствовал вашему последнему комментарию о том, что я хочу, чтобы все результаты были в одной таблице. Вы можете добавить еще одну временную таблицу и просто вставить в нее данные. Затем, когда закончите, выберите из этой таблицы перед закрытием курсора. Что касается наличия многих критериев в предложении WHERE, вы можете заключить одинарные кавычки с двумя одинарными кавычками, поэтому WHERE name = 'MyName' станет WHERE name = ''MyName''

Кстати, курсоры I не самые дружелюбные к процессору, и большинству не нравится их использовать, но они имеют свое место. Я не утверждаю, что это лучшее решение, но оно работает хорошо. У нас есть более 75 клиентских баз данных, имеющих одинаковую структуру, и я ежедневно использую их для обновления пользовательских полей и других полей таблиц. Он работает довольно быстро для выполнения такого количества операторов в таком количестве баз данных.

person Robert    schedule 07.12.2015
comment
Это выглядит действительно полезно. Чем можно заменить таблицу конфигурации, если у меня ее нет? - person Becky; 07.12.2015
comment
Ах я вижу. Есть ли способ получить результаты для всех в одной таблице вместо одной для каждой базы данных. Союз Все или что-то. В противном случае мне придется копировать и вставлять каждую таблицу в Excel (а их около 75). - person Becky; 07.12.2015
comment
Являются ли поля одинаковыми для каждой базы данных? - person Robert; 07.12.2015
comment
да они такие, должно быть все в порядке. Также у меня есть много критериев даты в предложениях where, как мне их получить, учитывая, что им нужны одинарные кавычки? Большое спасибо за вашу помощь в этом! - person Becky; 07.12.2015