Cómo ejecutar SQL contra todos los DB en un servidor

38

Tengo un SQL estándar que ejecuto en varias bases de datos en un solo servidor para ayudarme 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

¿Cómo puedo ejecutar esto en todas las bases de datos en un solo servidor? (además de conectarse manualmente a uno a la vez y ejecutar)

Andrew Bickerton
fuente
También puede encontrar útil esta alternativa de ms_foreachdb.
Nómada

Respuestas:

44

sp_MSForEachDB

Una opción es sp_MSForEachDB . Es indocumentado pero útil de todos modos

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

Una búsqueda en las interwebs también tiene muchos más ejemplos.

Nota: Al ser una función no compatible (que tiene algunos errores conocidos), es posible que desee escribir su propia versión (gracias @Pradeep)


El ejemplo de SQL anterior necesitaría ser reestructurado 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. ? se reemplaza en la consulta como el nombre de la base de datos, por lo tanto, estructura la consulta para definir explícitamente a qué DB se debe consultar
  2. modificado para usar sys.all_sql_modules, ya que contiene el texto completo del módulo (los syscomments podrían dividir la palabra clave cuando se extiende por filas)
gbn
fuente
sp_MSforeachdb puede ser escamoso a veces, así que mira el enlace provisto en la respuesta de Pradeep.
Eric Humphrey - lotsahelp
El sp_MSForEachDB parece bueno para una consulta rápida. ¿Hay alguna manera de que pueda mostrar de qué base de datos provienen cada resultado?
Diskdrive
@Diskdrive: agregue , ''?'' AS DBNamea cualquier instrucción select. Según mi ejemplo
gbn
9

Solo mis $ 0.05: SQL Multi Script (ejecución de múltiples scripts contra múltiples servidores SQL).

Garik
fuente
1
Respuestas como esta, que respaldan una solución comercial, deberían prohibirse ¡SO!
Fandango68
2
@ Fandango68 No estoy trabajando para esa empresa. Acabo de usar esa herramienta. No hay conflicto de intereses, ¿y tú? )
garik
44
@ Fandango68 Preferiría que no lo fueran. Las mejores soluciones siempre deben considerarse, y las mejores soluciones gratuitas sopesadas en su contra.
Paul
2

Hay un método adicional que dará salida en un único conjunto de resultados semi-fusionado. Primero abra Servidores registrados y cree un nuevo grupo en Grupos de servidores locales, luego registre su servidor una vez para cada base de datos, en cada caso establezca la base de datos predeterminada en la deseada.

Una vez completado, haga clic derecho en su grupo y seleccione Nueva consulta. La ventana de consulta que se abre tendrá "múltiples" donde normalmente vería un nombre de servidor en la barra de estado. Cualquier consulta que se ejecute en esta ventana funcionará en cada servidor registrado que estaba en el grupo. La primera columna de los resultados será el nombre del servidor registrado. El conjunto de resultados estará fragmentado por esa primera columna y el orden por testamentos solo operará dentro de ese fragmento.

Una funcionalidad muy poderosa pero pasada por alto para cuando rutinariamente tienes que ejecutar el mismo SQL en múltiples servidores.

Paul
fuente
Lo uso mucho y es una gran característica en SSMS. La desventaja es que es solo para uso manual, por lo que no es útil si desea automatizar algo para que se ejecute regularmente.
Sir Swears-a-lot
1

Mi empresa ha desarrollado una herramienta llamada xSQL Script Executor . Es gratuito para uso personal y, para mí, ha facilitado la implementación de scripts en múltiples objetivos.

Endi Zhupani
fuente
Este es un gran programa! Fácil de usar e intuitivo.
Sean Perkins
0

Desarrollé esta herramienta: https://github.com/andreujuanc/TakoDeploy

Todavía estoy escribiendo algunas líneas, pero es bastante estable por ahora. Lo he usado contra bases de datos de producción y funciona de maravilla.

Juan Carlos
fuente