it-swarm.it

Come eseguire SQL su tutti i DB su un server

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)

39
Andrew Bickerton

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 ha alcuni bug noti) potresti voler scrivere il tuo 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

NOTE:

  1. ? viene sostituito nella query come nome del database, quindi strutturare la query per definire esplicitamente su quale DB deve eseguire la query
  2. modificato per utilizzare sys.all_sql_modules come contiene il testo completo del modulo (syscomments could dividere la parola chiave quando si raggiunge lo spanning su righe)
44
gbn

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

9
garik

SSMS Tools Pack lo fa bene ed è gratuito per i server di database prima del 2012. La funzione: "Esegui su più destinazioni" - http://www.ssmstoolspack.com/Features?f=6

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 aprirà 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.

2
Paul

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.

1
Endi Zhupani

Ho sviluppato questo strumento: https://github.com/andreujuanc/TakoDeploy

Sto ancora scrivendo alcune righe, ma ormai è abbastanza stabile. L'ho usato contro i database di produzione e funziona come un fascino.

0
Juan Carlos