it-swarm-fr.com

Comment exécuter SQL sur toutes les bases de données sur un serveur

J'ai du SQL standard que j'exécute sur plusieurs bases de données sur un seul serveur pour m'aider à diagnostiquer les problèmes:

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

Comment puis-je exécuter cela sur toutes les bases de données sur un seul serveur? (en plus de se connecter manuellement à un à la fois et de l'exécuter)

39
Andrew Bickerton

sp_MSForEachDB

Une option est sp_MSForEachDB . C'est non documenté mais utile quand même

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

Une recherche sur les interwebs a aussi bien d'autres exemples

Remarque: Étant une fonction non prise en charge (qui a quelques bugs connus), vous voudrez peut-être écrire la vôtre version (merci @Pradeep)


L'exemple SQL ci-dessus devrait être restructuré comme suit:

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

REMARQUES:

  1. ? est remplacé dans la requête en tant que nom de base de données. Structurez donc la requête pour définir explicitement sur quelle base de données elle doit être interrogée.
  2. modifié pour utiliser sys.all_sql_modules comme contient le texte complet du module (syscomments pourrait diviser le mot-clé lorsqu'il atteint la portée sur les lignes)
44
gbn

Juste mon $ 0.05: SQL Multi Script (exécution de plusieurs scripts contre plusieurs serveurs SQL).

9
garik

SSMS Tools Pack le fait très bien et il est gratuit pour les serveurs de bases de données avant 2012. La fonctionnalité: "Exécuter sur plusieurs cibles" - http://www.ssmstoolspack.com/Features?f=6

3

Il existe une autre méthode qui donnera la sortie dans un seul jeu de résultats semi-fusionné. Ouvrez d'abord les serveurs enregistrés et créez un nouveau groupe sous Groupes de serveurs locaux, puis enregistrez votre serveur une fois pour chaque base de données, dans chaque cas, définissez la base de données par défaut sur celle souhaitée.

Une fois terminé, faites un clic droit sur votre groupe et sélectionnez Nouvelle requête. La fenêtre de requête qui s'ouvre aura "multiple" où vous verriez normalement un nom de serveur sur la barre d'état. Toutes les requêtes exécutées dans cette fenêtre fonctionneront sur chaque serveur enregistré qui faisait partie du groupe. La première colonne des résultats sera le nom du serveur enregistré. L'ensemble de résultats sera fragmenté par cette première colonne et les testaments ne fonctionneront que dans ce fragment.

Fonctionnalité très puissante mais négligée lorsque vous devez régulièrement exécuter le même SQL sur plusieurs serveurs.

2
Paul

Mon entreprise a développé un outil appelé xSQL Script Executor . Il est gratuit pour un usage personnel et pour moi, il a rendu le déploiement de scripts sur plusieurs cibles très facile.

1
Endi Zhupani

J'ai développé cet outil: https://github.com/andreujuanc/TakoDeploy

Je suis toujours en train d'écrire quelques lignes dessus, mais c'est assez stable maintenant. Je l'ai utilisé contre des bases de données de production et fonctionne comme un charme.

0
Juan Carlos