Подтвердить что ты не робот

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

У меня есть несколько баз данных с той же структурой, что и имя "Client1234", отличное от числа "клиент". В каждой базе данных есть таблица "Транзакции", и я хочу запустить запрос, чтобы получить все сырые в "транзакциях", таблицу во всех базах данных.

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

4b9b3361

Ответ 1

Попробуйте использовать хранимую процедуру 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

Ответ 2

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

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

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

Ответ 3

При использовании метода Fosco рекомендуется добавить в скобки [] имя базы данных:

SELECT 'SELECT count(*) FROM ' + '[' + name + ']' + '.dbo.transactions'   
FROM master..sysdatabases  
WHERE name like 'Client%'  and isnumeric(substring(name,6,1)) 

Ответ 4

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

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

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