2010-09-07 4 views
11

У меня есть несколько баз данных с той же структурой, что и имя «Client1234», отличное от числа «клиент». В каждой базе данных есть таблица «Транзакции», и я хочу запустить запрос в получать все сырые данные в таблице «транзакции» во всех базах данных.Запрос на несколько баз данных (SQL-сервер)

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

+0

Вы хотите динамически (без указания каждой базы данных) запроса всех баз данных? – Fosco

+0

да, мне нужно запустить один запрос во всех базах данных. –

ответ

12

Попробуйте использовать sp_msforeachdb хранимую процедуру следующим образом:

create table #temp ([rows] int, [client] varchar(100)) 
exec sp_msforeachdb ' 
if ''?'' like ''Client%'' and exists(select * from ?.sys.tables t where t.name = ''Transactions'') 
begin 
insert into #temp select count(*), ''?'' from ?..Transactions 
end 
' 
select * from #temp 
drop table #temp 
0

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

SELECT COUNT(*) FROM Client1.dbo.Transactions 
SELECT COUNT(*) FROM Client2.dbo.Transactions 
... 

Конечно, для каждой базы данных необходимо иметь соответствующие разрешения.

1

Вы можете использовать динамический SQL для создания этих запросов:

select 'select count(*) from ' + name + '.dbo.transactions' 
from master..sysdatabases 
where name like 'Client%' 
and isnumeric(substring(name,6,1)) 

Это возвращает набор результатов с каждой строки быть SQL-запрос для подсчета конкретной базы данных. Его можно было бы использовать с помощью языка программирования, используемого в качестве курсора и т. Д. Если вы предоставите более подробную информацию, я смогу предоставить лучший пример.

+0

Что делать, если в некоторых из этих баз данных нет этой таблицы транзакций? –

+0

Да, пожалуйста, предоставьте более подробную информацию. –

1

При использовании метода Фоско, это хорошая идея, чтобы поставить в скобки [] вокруг имени базы данных:

SELECT 'SELECT count(*) FROM ' + '[' + name + ']' + '.dbo.transactions' 
FROM master..sysdatabases 
WHERE name like 'Client%' and isnumeric(substring(name,6,1)) 
Смежные вопросы