Parcourir plusieurs bases de données et exécuter un script SQL

Erismzn63 Messages postés 1 Statut Membre -  
Morgothal Messages postés 1350 Statut Membre -
Bonjour,

Je cherche à développer un petit script qui permette de sectionner une liste de champs dans une table et ce pour chacune des bases de données d'un serveur.
J'ai du mal à savoir comment m'y prendre! Auriez vous des idées, exemples? Je suis preneur de toute remarques!

Merci a la communauté :)

1 réponse

  1. Morgothal Messages postés 1350 Statut Membre 184
     
    Bonjour,
    En créant un curseur qui passe sur toutes les bases d'un serveur :

    DECLARE @base varchar(20) 
    
    DECLARE curseur CURSOR FOR SELECT name from master.sys.databases 
    OPEN curseur 
    FETCH curseur into @base 
    WHILE @@FETCH_STATUS = 0 
    BEGIN 
    
    print (@base) 
    --select tes_champs from @base.ton_schéma.ta_table 
    
    FETCH curseur INTO @base 
    END 
    CLOSE curseur 
    DEALLOCATE curseur  
     


    A+ !
    -------------------
    Cordialement,
    Clément
    2
    1. Morgothal Messages postés 1350 Statut Membre 184
       
      Après, à toi d'exclure les bases systèmes (tu peux gérer ça avec l'ID de la base >4)
      0
    2. Pierrick
       
      Bonjour et merci pour ce script claire et concis.
      Je rencontre néanmoins un soucis de syntaxe (Msg 102, Niveau 15, État 1, Ligne 8
      Incorrect syntax near '.'.) lors de son implémentation dans mon environnement (SQL serveur 2005).

      DECLARE @base varchar(20)
      DECLARE curseur CURSOR FOR SELECT name from master.sys.databases where database_id >4 and name like '%ipm%'
      OPEN curseur
      FETCH curseur into @base
      WHILE @@FETCH_STATUS = 0
      BEGIN
      print (@base)
      select us_libelle from @base . dbo.UTILISAT where us_libelle like '%be%'
      --select us_libelle from IPM_V9E12.dbo.UTILISAT where us_libelle like '%be%'
      FETCH curseur INTO @base
      END
      CLOSE curseur
      DEALLOCATE curseur

      Pour info, la ligne en commentaire, qui utilise "en dur" le nom d'une des bases fonctionne très bien.
      0
    3. Morgothal Messages postés 1350 Statut Membre 184
       
      Salut,
      Dans ton cas, je ferais comme ça :
      DECLARE @base varchar(20), @SQL nvarchar(1000)
      DECLARE curseur CURSOR FOR SELECT name from master.sys.databases where database_id >4 and name like '%ipm%' 
      OPEN curseur 
      FETCH curseur into @base 
      WHILE @@FETCH_STATUS = 0 
      BEGIN 
      print (@base) 
      SET @SQL = 'select us_libelle from ['+@base+'] . dbo.UTILISAT where us_libelle like ''%be%'''
      EXEC (@SQL) 
      --select us_libelle from IPM_V9E12.dbo.UTILISAT where us_libelle like '%be%' 
      FETCH curseur INTO @base 
      END 
      CLOSE curseur 
      DEALLOCATE curseur 


      (Il y a peut-être des erreurs de quotes)
      A+
      0