Eu tenho essa consulta que itera todos os bancos de dados no meu SQL Server
DECLARE @DB_Name varchar(100)
DECLARE @Command nvarchar(200)
DECLARE database_cursor CURSOR FOR
SELECT name
FROM MASTER.sys.sysdatabases
where name not in ('master','tempdb','model','msdb')
OPEN database_cursor
FETCH NEXT FROM database_cursor INTO @DB_Name
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @Command = 'SELECT ' + '''' + @DB_Name + '''' + 'as DB_name, SF.filename, SF.size FROM sys.sysfiles SF'
EXEC sp_executesql @Command
FETCH NEXT FROM database_cursor INTO @DB_Name
END
CLOSE database_cursor
DEALLOCATE database_cursor
Mas como posso armazenar o resultado em uma tabela temporária?
Dan Guzman estava certo (em um comentário que ele apagou) que você pode apenas usar
master.sys.master_files
, e que você certamente deve evitar visualizações antigas comosysdatabases
esysfiles
, mas se você precisar fazer algo semelhante usando dados que não são convenientemente acumulados no master para você, você pode fazer algo assim:Observe nenhuma concatenação de strings desajeitada, sem mexer com 16 aspas simples consecutivas e o que acontece em seu código se um banco de dados for nomeado
oh'crap
? Eu mantenho bancos de dados como esse exatamente por esse motivo:No entanto, você pode apenas alterar o script que você tem agora para fazer isso:
Você também pode estar interessado no procedimento que escrevi,
sp_foreachdb
, pois certamente ao longo do caminho alguém sugerirá que você usesp_MSForEachDB
, que não está documentado, sem suporte e terrivelmente quebrado.Também faz parte do kit de primeiros socorros de Brent Ozar .