Come eseguire SQL su tutti i DB su un server


38

Ho alcuni SQL standard che eseguo su più database su un singolo server per aiutarmi a diagnosticare i problemi:

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

Come posso eseguirlo su tutti i database su un singolo server? (oltre a connettersi manualmente a uno alla volta ed eseguire)


Potresti trovare utile anche questa alternativa a ms_foreachdb.
Nomade,

Risposte:


44

sp_msforeachdb

Un'opzione è sp_MSForEachDB . È privo di documenti ma utile comunque

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

Una ricerca nelle interwebs ha anche molti altri esempi

Nota: essendo una funzione non supportata (che presenta alcuni bug noti) potresti voler scrivere la tua versione (grazie a @Pradeep)


L'esempio SQL sopra riportato dovrebbe essere ristrutturato come:

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

GLI APPUNTI:

  1. ? viene sostituito nella query come nome del database, quindi strutturare la query in modo da definire esplicitamente su quale DB deve eseguire la query
  2. modificato per usare sys.all_sql_modules come contiene il testo completo del modulo (i syscomments potrebbero dividere la parola chiave quando raggiungono lo spanning su righe)

sp_MSforeachdb a volte può essere traballante, quindi guarda il link fornito nella risposta di Pradeep.
Eric Humphrey - lotsahelp,

Sp_MSForEachDB sembra buono per una query veloce. C'è un modo per ottenerlo per mostrare da quale database provengono i risultati?
Diskdrive,

@Diskdrive: aggiungi , ''?'' AS DBNamea qualsiasi istruzione select. Come nel mio esempio
gbn

9

Solo $ 0,05: SQL Multi Script (esecuzione di più script su più server SQL).


1
Risposte come questa, sostenendo una soluzione commerciale, dovrebbero essere bandite SO!
Fandango68,

2
@ Fandango68 Non sto lavorando per quella compagnia. Ho appena usato questo strumento. Nessun conflitto di interessi, e tu? ).
Garik,

4
@ Fandango68 Preferirei che non lo fossero. Le migliori soluzioni dovrebbero sempre essere prese in considerazione e le migliori soluzioni gratuite devono essere valutate.
Paolo,


2

Esiste un ulteriore metodo che darà output in un singolo set di risultati semi-uniti. Aprire innanzitutto Server registrati e creare un nuovo gruppo in Gruppi di server locali, quindi registrare il server una volta per ciascun DB, impostando in ogni caso il DB predefinito su quello desiderato.

Una volta completato, fai clic con il pulsante destro del mouse sul tuo gruppo e seleziona Nuova query. La finestra della query che si apre avrà "multipli" in cui normalmente vedresti un nome di server sulla barra di stato. Qualsiasi query eseguita in questa finestra funzionerà su ciascun server registrato che era nel gruppo. La prima colonna dei risultati sarà il nome del server registrato. Il set di risultati sarà frammentato da quella prima colonna e l'ordine per volontà opererà solo all'interno di quel frammento.

Funzionalità molto potente ma trascurata per quando è necessario eseguire regolarmente lo stesso SQL su più server.


Lo uso molto ed è un'ottima funzionalità in SSMS. Il rovescio della medaglia è che è solo per uso manuale, quindi non è utile se si desidera automatizzare qualcosa da eseguire regolarmente.
Sir Swears-a-lot

1

La mia azienda ha sviluppato uno strumento chiamato xSQL Script Executor . È gratuito per uso personale e per me ha reso molto semplice la distribuzione di script su più target.


Questo è un bel programma! Facile da usare e intuitivo.
Sean Perkins,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.