Esta é uma pergunta sobre lógica que pode me ajudar a entender mais como iterar em meus bancos de dados.
No meu servidor tenho vários bancos de dados AdventureWorks*:
Eu tenho uma consulta que me ajuda a percorrer todos os meus bancos de dados, AdventureWorks * e não:
CREATE TABLE #LIst_DB (name nvarchar(128))
INSERT INTO #LIst_DB
select name from sys.databases
WHERE database_id > 4
AND state = 0;
select * from #LIst_DB
DROP TABLE #LIst_DB
Para cada banco de dados AdventureWorks* que desejo listar AWBuildVersion
ao lado de cada banco de dados:
Neste ponto, estou intrigado porque há 2 problemas que não sei como resolver:
- Como executar um
select [Database Version] from AWBuildVersion
para cada banco de dados? - O que fazer se um banco de dados não tiver
AWBuildVersion
tabela?
Aqui encontrei esta consulta:
DECLARE @SQL NVARCHAR(max)
SET @SQL = stuff((
SELECT '
UNION
SELECT ' + quotename(NAME, '''') + ' as Db_Name, Name collate SQL_Latin1_General_CP1_CI_AS as Table_Name
FROM ' + quotename(NAME) + '.sys.tables WHERE NAME = @TableName '
FROM sys.databases
ORDER BY NAME
FOR XML PATH('')
,type
).value('.', 'nvarchar(max)'), 1, 8, '')
--PRINT @SQL;
EXECUTE sp_executeSQL @SQL
,N'@TableName varchar(30)'
,@TableName = 'AWBuildVersion'
Isso me aproxima do meu objetivo, mas me mostra o nome da tabela AWBuildVersion
enquanto preciso da coluna Versão do banco de dados = 11.0.2100.60
Eu não gostaria de fazer isso com o T-SQL porque isso me limita na quantidade de servidores dos quais eu poderia obter os resultados.
Em vez disso, eu criaria um script do PowerShell como este:
Você precisa do módulo dbatools powershell para executá-lo.
O que ele faz é:
Comentários em linha:
Eu provavelmente usaria contido no First Responder Kit
sp_foreachDB
de Brent Ozar :Não testei isso, mas acredito que a sintaxe deve funcionar.