IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Boucle SQL pour plusieurs bases de données


Sujet :

Développement SQL Server

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2019
    Messages : 7
    Points : 6
    Points
    6
    Par défaut Boucle SQL pour plusieurs bases de données
    Bonjour,

    J'ai besoin d'aller chercher des résultats de différentes bases.

    Ma requête est par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select "ARR001" as db, E_GENERAL, E_AUXILIAIRE, E_DEBIT, E_CREDIT from DBARR001.DBO.ecriture
    ou ARR001 est ma base.

    Sauf que je dois aller chercher cette même requête pour une centaine de base.

    J'écris donc à la suite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select "ARR001" as db, E_GENERAL, E_AUXILIAIRE, E_DEBIT, E_CREDIT from DBARR001.DBO.ecriture
    select "ARR002" as db, E_GENERAL, E_AUXILIAIRE, E_DEBIT, E_CREDIT from DBARR002.DBO.ecriture
    select "ARR003" as db, E_GENERAL, E_AUXILIAIRE, E_DEBIT, E_CREDIT from DBARR003.DBO.ecriture
    select "ARR004" as db, E_GENERAL, E_AUXILIAIRE, E_DEBIT, E_CREDIT from DBARR004.DBO.ecriture
    select "ARR005" as db, E_GENERAL, E_AUXILIAIRE, E_DEBIT, E_CREDIT from DBARR005.DBO.ecriture
    select "ARR006" as db, E_GENERAL, E_AUXILIAIRE, E_DEBIT, E_CREDIT from DBARR006.DBO.ecriture
    select "ARR007" as db, E_GENERAL, E_AUXILIAIRE, E_DEBIT, E_CREDIT from DBARR007.DBO.ecriture
     
    etc...
    Je voudrais déclarer ma liste de base de données.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Declare list = (ARR001, ARR002, ...)
    et écrire une sorte de boucle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For (tout les les éléments de ma liste)
    Do 
    select "liste" as db, E_GENERAL, E_AUXILIAIRE, E_DEBIT, E_CREDIT from DBliste.DBO.ecriture
    Comment faire ?

    En vous remerciant par avance,

    Lionel

  2. #2
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    Bonjour,

    Transact SQL

    Ce genre quoi ...
    https://sqlpro.developpez.com/cours/...r/transactsql/
    Emérite, émérite je ne pense pas ... plutôt dans le développement depuis FORT FORT longtemps, c'est mon job, ça oui
    A part ça ... Il ne pleut jamais en Moselle !

  3. #3
    Invité
    Invité(e)
    Par défaut
    regarde ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EXECUTE sp_msforeachdb 'use [?]; IF EXISTS ( SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = ''NomTable'' and TABLE_SCHEMA = ''dbo'') SELECT ''?'' as bd, * FROM dbo.NomTable'

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2019
    Messages : 7
    Points : 6
    Points
    6
    Par défaut Besoin d'explication
    Citation Envoyé par 7gyY9w1ZY6ySRgPeaefZ Voir le message
    regarde ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EXECUTE sp_msforeachdb 'use [?]; IF EXISTS ( SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = ''NomTable'' and TABLE_SCHEMA = ''dbo'') SELECT ''?'' as bd, * FROM dbo.NomTable'
    Bonjour
    Merci pour votre réponse.
    Etant relativement novice, je ne comprend pas ou je met mes différentes bases de données.
    Pouvez vous m'expliquer svp ?

    Merci

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2019
    Messages : 7
    Points : 6
    Points
    6
    Par défaut Besoin d'explication
    Citation Envoyé par vttman Voir le message
    Bonjour,

    Transact SQL

    Ce genre quoi ...
    https://sqlpro.developpez.com/cours/...r/transactsql/
    Que voulez vous dire par la ?
    Pouvez vous m'expliquer svp ?
    Merci d'avance

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par layo0789 Voir le message
    Etant relativement novice, je ne comprend pas ou je met mes différentes bases de données.
    La fonction sp_msforeachdb va boucler sur TOUTES les bases de données d'une instance. Dans la commande, le nom des bds est remplacé par ?
    C'est une fonction de MS Sql server non documenté.

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 761
    Points : 52 547
    Points
    52 547
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par layo0789 Voir le message
    Bonjour,

    J'ai besoin d'aller chercher des résultats de différentes bases.

    Ma requête est par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select "ARR001" as db, E_GENERAL, E_AUXILIAIRE, E_DEBIT, E_CREDIT from DBARR001.DBO.ecriture
    ou ARR001 est ma base.

    Sauf que je dois aller chercher cette même requête pour une centaine de base.

    J'écris donc à la suite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select "ARR001" as db, E_GENERAL, E_AUXILIAIRE, E_DEBIT, E_CREDIT from DBARR001.DBO.ecriture
    select "ARR002" as db, E_GENERAL, E_AUXILIAIRE, E_DEBIT, E_CREDIT from DBARR002.DBO.ecriture
    select "ARR003" as db, E_GENERAL, E_AUXILIAIRE, E_DEBIT, E_CREDIT from DBARR003.DBO.ecriture
    select "ARR004" as db, E_GENERAL, E_AUXILIAIRE, E_DEBIT, E_CREDIT from DBARR004.DBO.ecriture
    select "ARR005" as db, E_GENERAL, E_AUXILIAIRE, E_DEBIT, E_CREDIT from DBARR005.DBO.ecriture
    select "ARR006" as db, E_GENERAL, E_AUXILIAIRE, E_DEBIT, E_CREDIT from DBARR006.DBO.ecriture
    select "ARR007" as db, E_GENERAL, E_AUXILIAIRE, E_DEBIT, E_CREDIT from DBARR007.DBO.ecriture
     
    etc...
    Je voudrais déclarer ma liste de base de données.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Declare list = (ARR001, ARR002, ...)
    Il n'existe pas de type liste ou tableau dans SQL Server. Une liste ou un tableau cela peut se remplacer bien plus efficacement par une table qui peut être indexé. Un tableau ou une liste ne peut pas être indexé ! D’où le chois de MS SQL Server de ne pas implémenter ce genre de conneries antiperformantes ! mais vous pouvez utiliser un curseur...

    et écrire une sorte de boucle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For (tout les les éléments de ma liste)
    Do 
    select "liste" as db, E_GENERAL, E_AUXILIAIRE, E_DEBIT, E_CREDIT from DBliste.DBO.ecriture
    Avec un curseur justement sur toutes les bases.

    Petit exemple :
    https://sqlpro.developpez.com/cours/...sactsql/#LIV-G

    Comment faire ?

    En vous remerciant par avance,

    Lionel
    mais le mieux passe souvent par du SQL dynamique....

    Nous supposons que vos bases se nomment toutes ARR suivi d'un n°.

    Petit exemple 1 SELECTs successifs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DECLARE @SQL NVARCHAR(max) = N'';
    SELECT @SQL = @SQL + N'SELECT ' + name + N' as db, E_GENERAL, E_AUXILIAIRE, E_DEBIT, E_CREDIT from [' + name + N'].DBO.ecriture;'
    FROM   sys.databases
    WHERE  name LIKE 'ARR%';
    EXEC (@SQL);
    Petit exemple 2 un seul SELECT avec UNION ALL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DECLARE @SQL NVARCHAR(max) = N'';
    SELECT @SQL = @SQL + N'SELECT ' + name + N' as db, E_GENERAL, E_AUXILIAIRE, E_DEBIT, E_CREDIT from [' + name + N'].DBO.ecriture UNION ALL '
    FROM   sys.databases
    WHERE  name LIKE 'ARR%';
    SET @SQL = LEFT(@SQL, LEN(@SQL) - 10)
    EXEC (@SQL);
    Et pour vous former, mon livre :


    A +
    Nom : Couverture livre SQL server Eyrolles.jpg
Affichages : 974
Taille : 105,0 Ko
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. Une requête SQL pour une base de données
    Par clairetj dans le forum Requêtes
    Réponses: 4
    Dernier message: 24/04/2011, 21h02
  2. DER pour une bases de données SQL (2000)
    Par DEV-10 dans le forum Développement
    Réponses: 1
    Dernier message: 29/11/2008, 12h22
  3. Réponses: 4
    Dernier message: 26/02/2008, 14h55
  4. Réponses: 3
    Dernier message: 08/12/2005, 19h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo