Como executar o SQL em todos os bancos de dados em um servidor

38

Eu tenho algum SQL padrão que eu corro em vários bancos de dados em um único servidor para me ajudar a diagnosticar problemas:

select 
    so.name,
    so.type,
    MAX(case when sc.text like '%remote%' then '' ELSE 'N' END) AS Relevant,
    @@ServerName as Server,
    DB_Name() as DBName 
from
    sysobjects so with (nolock)
    join syscomments sc with (nolock) on so.id = sc.id
where (sc.text like '%emote%')
group by so.name, so.type
order by so.type, so.name

Como posso executar isso em todos os bancos de dados em um único servidor? (além de conectar-se manualmente a um de cada vez e executar)

Andrew Bickerton
fonte
Você também pode achar útil essa alternativa do ms_foreachdb.
Nomad

Respostas:

44

sp_MSForEachDB

Uma opção é sp_MSForEachDB . Não é documentado, mas é útil, no entanto

DECLARE @command varchar(1000) 
SELECT @command = 
    'USE [?] UPDATE Table1 SET Field1 = ''ninjas'' WHERE Field2 = ''pirates''' 
EXEC sp_MSforeachdb @command

Uma pesquisa nas interwebs também tem muitos outros exemplos

Nota: Sendo uma função não suportada (que possui alguns erros conhecidos), você pode querer escrever sua própria versão (obrigado @Pradeep)


O exemplo SQL acima precisaria ser reestruturado como:

DECLARE @findKeySQL nvarchar(2000)
DECLARE @searchKey nvarchar(20)

SET @searchKey = lower('%remote%')

SET @findKeySQL = 'IF ''[?]'' NOT IN (''[master]'', ''[model]'', 
                                     ''[msdb]'', ''[tempdb]'')
        select 
            so.name,
            so.type,
            @@ServerName as Server,
            ''?'' as DBName 
        from
            [?].dbo.sysobjects so with (nolock)
            join [?].sys.all_sql_modules sc with (nolock) on so.id = sc.object_id
        where (lower(sc.definition) like ''' + @searchKey + ''')
        group by so.name, so.type
        order by so.type, so.name'

EXEC sp_MSForEachDB @findKeySQL

NOTAS:

  1. ? é substituído na consulta como o nome do banco de dados, estruture a consulta para definir explicitamente em qual banco de dados ele deve consultar
  2. modificado para usar sys.all_sql_modules como retém o texto completo do módulo (os syscomments podem dividir a palavra-chave quando atingirem a extensão das linhas)
gbn
fonte
Às vezes, o sp_MSforeachdb pode ser esquisito; veja o link fornecido na resposta do Pradeep.
Eric Humphrey - lotsahelp
O sp_MSForEachDB parece bom para uma consulta rápida. Existe uma maneira de mostrar de qual banco de dados cada resultado veio?
Diskdrive 19/09/16
@ DiskDive: adicione , ''?'' AS DBNamea qualquer instrução de seleção. Conforme meu exemplo
gbn 20/09/16
9

Apenas meu $ 0,05: SQL Multi Script (execução de vários scripts em vários servidores SQL).

garik
fonte
1
Respostas como essa, endossando uma solução comercial, devem ser proibidas SO!
Fandango68
2
@ Fandango68 Não estou trabalhando para essa empresa. Eu apenas usei essa ferramenta. Sem conflito de interesses, e você? )
Garik3 de
4
@ Fandango68 Eu preferiria que não fossem. As melhores soluções devem sempre ser consideradas e as melhores soluções gratuitas pesadas contra elas.
Paulo Paulo
2

Existe outro método que fornecerá saída em um único conjunto de resultados semi-mesclados. Primeiro abra Servidores registrados e crie um novo grupo em Grupos de servidores locais e depois registre seu servidor uma vez para cada banco de dados, definindo, em cada caso, o banco de dados padrão como o desejado.

Depois de concluído, clique com o botão direito do mouse no seu grupo e selecione Nova Consulta. A janela de consulta que se abre terá "múltiplo", onde você normalmente veria um nome de servidor na barra de status. Qualquer consulta executada nesta janela funcionará em cada servidor registrado que estava no grupo. A primeira coluna dos resultados será o nome do servidor registrado. O conjunto de resultados será fragmentado por essa primeira coluna e a ordem por vontades somente operará nesse fragmento.

Funcionalidade muito poderosa, mas esquecida, para quando você rotineiramente precisa executar o mesmo SQL em vários servidores.

Paulo
fonte
Eu uso muito isso e é um ótimo recurso no SSMS. A desvantagem é que é apenas para uso manual, portanto, não é útil se você deseja automatizar algo para executar regularmente.
Sir Swears-muito-
1

Minha empresa desenvolveu uma ferramenta chamada xSQL Script Executor . É gratuito para uso pessoal e, para mim, facilitou a implantação de scripts em vários destinos.

Endi Zhupani
fonte
Esse é um ótimo programa! Fácil de usar e intuitivo.
Sean Perkins
0

Eu desenvolvi esta ferramenta: https://github.com/andreujuanc/TakoDeploy

Ainda estou escrevendo algumas linhas, mas já está bem estável. Eu o usei em bancos de dados de produção e funciona como um encanto.

Juan Carlos
fonte