Найдите общее количество данных, записанных в две одинаковые таблицы из двух разных баз данных - PullRequest
0 голосов
/ 14 июля 2020

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

DECLARE @counter int
SET @counter = (SELECT COUNT(*) as TOTAL FROM database1.dbo.User);
SET @counter = @counter + (SELECT COUNT(*) as TOTAL FROM database2.dbo.User);
SET @counter = @counter + (SELECT COUNT(*) as TOTAL FROM database3.dbo.User);
PRINT @counter;

Но я ищу более простой способ, потому что на моем сервере более 200 баз данных, и мне нужно выбрать почти 35 из них, имена которых начинаются так же, как и числа, которые их определяют, например: database1 database2

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

Ответы [ 2 ]

2 голосов
/ 14 июля 2020

Вы можете использовать недокументированное sp_MsForEachDb

? заменяется именем БД.

Попробуйте что-то вроде:


CREATE TABLE #T (Total INT, DbName SYSNAME)

exec sp_MsForEachDb '

IF EXISTS (SELECT 1 FROM ?.sys.tables WHERE Name = ''Users'') 
 AND ''?'' LIKE ''Database%''
BEGIN
  INSERT INTO #T(Total, DbName)
  SELECT count(1) Total, ''?'' DbName
  FROM ?.dbo.Users
END
'

SELECT *
FROM #T
-- 
-- WHERE DbName LIKE '%SOMECONDITION%' 

Чтобы получить документация, которую вы можете оформить: EXEC sp_helptext sp_msforeachdb

0 голосов
/ 14 июля 2020

Следующее также даст вам желаемые результаты без создания временной таблицы:

declare
    @sql varchar(max)   =   ''
,   @maxid  int =   (select max(database_id) from sys.databases)


select  @sql = @sql +
'select '''+name+''' DatabaseName, count(*) [Count] from '+quotename(name)+'.[dbo].[User]'+char(10)+ case when database_id = @maxid then '' else 'union all' end+char(10)
from    sys.databases
where   name not in ('master','model','msdb','tempdb')
order by database_id

print   (@sql)
exec    (@sql)

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

Результаты будут выглядеть так до выполнения Dynami c SQL:

Ожидаемые результаты

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...