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

  1. #1
    Nouveau membre du Club
    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
    Points : 33
    Points
    33
    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
    Points : 13 092
    Points
    13 092
    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
    Nouveau membre du Club
    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
    Points : 33
    Points
    33
    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 865
    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 865
    Points : 53 021
    Points
    53 021
    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 +

  5. #5
    Nouveau membre du Club
    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
    Points : 33
    Points
    33
    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
    Points : 13 092
    Points
    13 092
    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
    Nouveau membre du Club
    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
    Points : 33
    Points
    33
    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
    Points : 13 092
    Points
    13 092
    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 ?

  9. #9
    Nouveau membre du Club
    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
    Points : 33
    Points
    33
    Par défaut
    Je n'ai juste rajouté que la première ligne, mais je n'ai rien changé dans ce que vous m'avez proposé.
    Voici le code que j'ai lancé :

    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
    18
     
    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
    Je ne comprend pas votre denière question :

    Par ailleurs, avez-vous lancé directement via EXECUTE, ou avez-vous fait un PRINT, puis copier/coller ?
    J'ai copié/coller le code ci-dessus dans une nouvelle requete sur mon instace, puis j'ai tapé sur 'ALT+X' pour executer la requête

  10. #10
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 865
    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 865
    Points : 53 021
    Points
    53 021
    Billets dans le blog
    6
    Par défaut
    d'abord c'est :
    EXEC (@SQL) --> parenthèses
    Ensuite pourquoi du NVARCHAR(max) ? cela fait 1 milliard de caractère seulement avec qu'avec du VARCHAR on passe à 2 milliards.

    Je réitère ma remarque... 1600 bases c'est de la folie. Et la requête que vous voulez faire et le temps perdu justifie pleinement la remodélisation en une seule base, par exemple avec 1600 schémas SQL !
    Cela n'aura au final que peu d'impact sur la production si vous implémentez autant d'utilisateur SQL que de base, avec pour chacun un schéma par défaut correspondant. (aucune modif de l'application).

    A +

  11. #11
    Nouveau membre du Club
    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
    Points : 33
    Points
    33
    Par défaut
    Bonjour SQL Pro,

    J'ai remonté votre remarque hier, et cela a semblé susciter de l'interêt,
    la question est donc en étude, entre remodélisation et ETL.

    D'autre part j'ai apporté les modifications que vous m'avez proposé, j'en suis à plus d'une 1 h d'execution sans résultat ( le passage par une table temporaire met 20 min)... j'ai peur que le script boucle "à l'infinie" ..



    EDIT : J'ai rajouté un print avant le execut (@sqlcommand) la requete se cosntruit petit a petit, l'affichage également ca me semble ok
    je clos la discution.

    Merci a vous en tout cas !

    Bonne journée

+ 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