2015-12-07 4 views
0

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

sp_MsForEachDb 

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

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

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

+0

Я бы предположил выбор из sys.databases, плюс оператор «where in» для ветвей. – evictednoise

+0

Как вы используете sys.databases? Я не делал этого раньше ... – Becky

+0

Это представление в sql server master db, которое содержит информацию о базе данных. просто попробуйте 'select * from sys.databases'. Также msdn https://msdn.microsoft.com/en-us/library/ms178534.aspx – evictednoise

ответ

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 можно заключить одиночные кавычки с 2 одиночными кавычками, так WHERE name = 'MyName' становится WHERE name = ''MyName''

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

+0

Это выглядит очень полезно. Что я могу заменить в таблице конфигурации, поскольку у меня ее нет? – Becky

+0

А я вижу. Есть ли способ получить результаты для всех в одной таблице вместо одной базы данных. Союз Все или что-то. В противном случае мне придется копировать и вставлять каждую таблицу в excel (и их около 75). – Becky

+0

Являются ли все поля одинаковыми для каждой базы данных? – Robert

Смежные вопросы