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

MS SQL Server Discussion :

SELECT multi Table avec pointeur dynamique


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 68
    Par défaut SELECT multi Table avec pointeur dynamique
    Bonjour,

    Je bloque sur une requete que je compte insérer dans un Tableau pour une appli VB.NET.

    Sur une Instance SQL SERVER 2005 j'ai un grand nombre de base (1800),
    je souhaiterai faire une requete du type :
    Select colonne1 FROM base1, Base2, Base3 ....

    pour le moment j'arrive a faire cette requete via des pointeurs dynamique, mais le résultat obtenu est sous forme de multiple tableaux (du coup je n'arrive pas a avoir un tableau global)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    DECLARE @sqlcommand nvarchar (512) 
    DECLARE @NomDB nvarchar (100)
     use master
     declare curseur CURSOR 
    for select name from sys.sysdatabases 
    WHERE name like '%dbPB%' OR name like '%dbCAM%' AND name <> 'DBCAM'
    open curseur 
    Fetch next from CURSEUR into @NomDB 
    while @@Fetch_status = 0 
    begin 
    set @sqlcommand = 'SELECT * FROM [' + @NomDB + '].dbo.tbdParameterLogs' 
    execute (@sqlcommand) 
    Fetch next from CURSEUR into @NomDB 
    End 
    close curseur 
    deallocate curseur

    Auriez vous une piste, ou mieux La solution?! ;

    Merci d'avance


    Gab

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour

    Vous pouvez faire quelque chose comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    DECLARE @sqlcommand nvarchar (MAX) 
    USE master
     
    SELECT 
    	@sqlcommand = COALESCE(@sqlcommand + ' 
     UNION ALL 
    ', '') + ' SELECT * FROM  [' + name + '].dbo.tbdParameterLogs'   
    FROM	sys.sysdatabases 
    WHERE	name LIKE '%dbPB%' 
    	OR	name LIKE '%dbCAM%' 
    	AND name <> 'DBCAM'
     
    EXECUTE (@sqlcommand)
    Bien sûr, les tables tbdParameterLogs des vos différentes bases de données doivent avoir la même structure...

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 68
    Par défaut
    Bonjour aieeeuuuuu!

    EDIT : En faite j'ai parlé un peu vite, la requête ne renvoi pas d'erreur mais tourne depuis 10 min sans résultat.... j'ai peur qu'elle tourne quelque part en rond .......

    Merci pour cette réponse, ca fonctionne, je connaissais pas le 'COALESCE'
    J'étais partie sur une insertion récursive de ma requête dans une table temporaire, surement plus gourmand...

    D'autre part j'ai une dernière petite question :

    Je restreins mon SELECT à celles commencant par 'dbCAM' et 'dbCAM'
    Or je me trouve face à une dizaine de cas ou ma table tbdParameterLogs est absente de ces DBs.

    Y aurait il un moyen pour ne prendre que les DB ou la table tbdParameterLogs existe? (j'essaye avec IF EXISTS mais sans succès...)

    Merci !

    gab

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    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 998
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par gabouille Voir le message
    Sur une Instance SQL SERVER 2005 j'ai un grand nombre de base (1800)
    Au passage 1800 bases, c'est vraiment de la folie. Vous devez avoir un problème de conception....

    Pourquoi autant de bases ????

    A +
    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/ * * * * *

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 68
    Par défaut
    @SQLpro,

    Je suis entièrement d'accord, ce sont des systèmes de BDD qui ont été installé il y a quelques années dans mon entreprise et qui ne manqueraient pas de vous horifier.... Mais ne pouvant les changer, je dois m'arranger pour les exploiter..

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Pour vérifier si la table existe, vous pouvez utiliser OBJECT_ID :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    DECLARE @sqlcommand nvarchar (MAX) 
    USE master
     
    SELECT 
    	@sqlcommand = COALESCE(@sqlcommand + ' 
     UNION ALL 
    ', '') + ' SELECT * FROM  [' + name + '].dbo.tbdParameterLogs'   
    FROM	sys.sysdatabases 
     
    WHERE	
    		name LIKE '%dbPB%' 
    	OR	name LIKE '%dbCAM%' 
    	AND name <> 'DBCAM'
    	AND OBJECT_ID('[' + name + '].dbo.tbdParameterLogs' , 'U' ) IS NOT NULL
     
    EXECUTE @sqlcommand
    Pour ce qui est du temps d’exécution, vous ne pouvez quand même pas en vouloir a SQL Server de mettre plus de 10 minutes pour aller lire les données dans 1800 tables !!!
    Surtout que vu le nom de la table (tbdParameterLogs) j'imagine qu'elle contient pas mal de colonnes et surtout pas mal de lignes. Voulez-vous vraiment tout ramener ? il faudrait peut-être restreindre les colonnes et les lignes à sélectionner.

    Cela dit, pour le test, vous pouvez mettre un TOP(n), et spécifier une colonne plutôt que * dans la requête que je vous ai proposée...

    Mais au final, si vous voulez avoir des temps de réponse corrects, il faudra revoir votre architecture ! (la limite a 32000 bases sous SQL Server, c'est juste une limite... pas un objectif )

  7. #7
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 68
    Par défaut
    Merci pour ces Infos
    L'explication que l'on m'a donné concernant l'architerture de nos SGBD est qu'il s'agit d'une "adaptation" de base de donnée temps réelle..

    Bref revenons au code

    J'ai un message d'erreur "msg 203", la structure est ok au niveau de la commande. le "seul" bémole est qu'elle se coupe en plein milieu du nom d'une base :

    Msg 203, Level 16, State 2, Line 18
    Il nome ' SELECT * FROM [db].dbo.tbdParameterLogs
    UNION ALL
    SELECT * FROM [lot1].dbo.tbdParameterLogs
    UNION ALL
    SELECT * FROM [lot2].dbo.tbdParameterLogs
    UNION ALL
    SELECT * FROM [lot3].dbo.tbdParameterLogs
    UNION ALL
    SELECT * FROM [lot4].dbo.tbdParameterLogs
    UNION ALL
    SELECT * FROM [lot5].dbo.tbdParameterLogs
    UNION ALL
    SELECT * FROM [lo' non è un identificatore valido.

    Je pensais en premier lieu au nombre de caractère max de ma commande, mais j'ai bien renseigné nvarchar(MAX) (et je ne pas avoir atteint le max )

    Sinon j'ai trouvé l'alternative de la base temporaire.

    Merci !

  8. #8
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,

    Pourriez vous poster exactement le code que vous avez exécuté... Je ne comprend pas comment vous pouvez avoir ces noms de base avec le filtre spécifié...

    Par ailleurs, avez-vous lancé directement via EXECUTE, ou avez-vous fait un PRINT, puis copier/coller ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 27/03/2012, 17h15
  2. [MySQL] Requete SELECT multi-tables avec un ORDER BY
    Par Twenty4 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 22/12/2010, 02h36
  3. Selection multi table avec filtre
    Par curumo dans le forum Requêtes
    Réponses: 6
    Dernier message: 20/11/2009, 23h16
  4. update d'un champ avec select multi-table
    Par maxvador dans le forum Hibernate
    Réponses: 1
    Dernier message: 23/09/2009, 11h54
  5. [syntaxe]Creation table avec nom dynamique
    Par ZuZu dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 23/09/2004, 18h01

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