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 :

Problème de requête XML utilisant des "UNION" et "table imbriquée"


Sujet :

Développement SQL Server

  1. #1
    Futur Membre du Club
    Homme Profil pro
    technicien informatique
    Inscrit en
    Septembre 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : technicien informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2017
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Problème de requête XML utilisant des "UNION" et "table imbriquée"
    Bonjour

    Base de donnée : SQL server 2008R2
    Outil : fenêtre de requête SQL server

    Problème :

    Je bloque sur une requête qui me retourne l'erreur (ci-dessous) :

    Msg 1086, Niveau 15, État 1, Ligne 20
    La clause FOR XML n'est pas valide dans les vues, les fonctions inline, les tables dérivées et les sous-requêtes lorsque celles-ci contiennent un opérateur défini. Pour contourner ce problème, encapsulez la clause SELECT contenant un opérateur défini au moyen d'une syntaxe de table dérivée et appliquez FOR XML à celle-ci.
    Pour le moment je n'ai pas trouvé la solution à ce problème.

    Requête 1 :
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    	SELECT
    		R.id_region as regcode,
    		R.intitule as regint,
    		(
    		SELECT 
    			C1.id_centre as centre_code,
    			C1.intitule as centre_int
    		FROM
    			CENTRE C1
    		WHERE 
    			C1.id_centre = '00001'
    		UNION
    		SELECT 
    			C2.id_centre as centre_code,
    			C2.intitule as centre_int
    		FROM 
    			CENTRE C2
    		WHERE 
    			C2.id_centre = '00002'
    		ORDER BY 
    			centre_code
    		FOR XML AUTO
    		) as XML_centre
     
    		FROM 
    			REGION R
    Le résultat "Résultats dans les grilles" dans SQL server 2008R2 que je voulais :

    regcode regint XML_centre
    A1 ALSACE <centre code="00001">.........</centre>
    etc... etc... etc...

    Cependant ma requête fonctionne sous la forme (ci-dessous) mais elle ne correspond pas au résultat attendu :

    Requête 2 :
    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
    19
     
    	SELECT 
    		C1.id_centre as centre_code,
    		C1.intitule as centre_int
    	FROM 
    		CENTRE C1
    	WHERE 
    		C1.id_centre = '00001'
    	UNION
    	SELECT 
    		C2.id_centre as centre_code,
    		C2.intitule as centre_int
    	FROM
    		CENTRE C2
    	WHERE 
    		C2.id_centre = '00002'
    	ORDER BY 
    		centre_code
    	FOR XML AUTO
    Ci-joint les scripts (un jeu de test pour l'exemple / la requête ) pour faciliter votre aide

    Script_exemple.sql
    Script_requete.sql

    Pouvez-vous m'aider à faire fonctionner la requête 1 ?

    Merci d'avance pour vos réponses et bonne journée

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 766
    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 766
    Points : 52 561
    Points
    52 561
    Billets dans le blog
    5
    Par défaut
    Beaucoup d'erreur... UNION ALL et CAST AS XML...

    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
    WITH 
    T0 AS  (SELECT C1.id_centre as centre_code,
                   C1.intitule as centre_int
            FROM   CENTRE C1
            WHERE  C1.id_centre = '00001'
            UNION  ALL
            SELECT C2.id_centre as centre_code,
                   C2.intitule as centre_int
           FROM    CENTRE C2
           WHERE   C2.id_centre = '00002')
    SELECT R.id_region as regcode,
    		 R.intitule as regint,
           CAST((SELECT * 
                 FROM   T0
                 ORDER  BY centre_code
                 FOR XML AUTO) AS XML) XML_centre 
    FROM REGION AS R;
    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/ * * * * *

  3. #3
    Futur Membre du Club
    Homme Profil pro
    technicien informatique
    Inscrit en
    Septembre 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : technicien informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2017
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Merci pour la réponse.

    Je remarque que j'ai trop simplifié ma demande (exemple) pour pouvoir poser ma question mais je commence à obtenir un bon résultat de ce que je voulais.

    Je post ultérieurement à la discussion la solution (requête, exemple, etc ...) que vous m'avez montré pour partager avec les membres.

    j'ai noté que je dois revoir la syntaxe "UNION ALL" pour comprendre (le pourquoi?) car j'ai la tendance de mettre que la syntaxe "UNION"

    Cordialement

    xyzwar

  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 766
    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 766
    Points : 52 561
    Points
    52 561
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par xyzwar Voir le message
    j'ai noté que je dois revoir la syntaxe "UNION ALL" pour comprendre (le pourquoi?) car j'ai la tendance de mettre que la syntaxe "UNION"
    codez les deux requêtes, avec et sans le ALL. Comparez les plans. Le UNION ALL dédoublonne le UNION ne dédoublonne pas. La différence est sensible au niveau perf.

    Pour votre requête, je pense qu'il faudrait la corréler...

    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
    WITH 
    T0 AS  (SELECT C1.id_centre as centre_code,
                   C1.intitule as centre_int
            FROM   CENTRE C1
            WHERE  C1.id_centre = '00001'
            UNION  ALL
            SELECT C2.id_centre as centre_code,
                   C2.intitule as centre_int
            FROM   CENTRE C2
            WHERE  C2.id_centre = '00002')
    SELECT R.id_region as regcode,
           R.intitule as regint,
           CAST((SELECT * 
                 FROM   T0
    			 WHERE  T0.??? = R.??? --> correlation !
                 ORDER  BY centre_code
                 FOR XML AUTO) AS XML) XML_centre 
    FROM REGION AS R;
    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
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Le UNION ALL dédoublonne le UNION ne dédoublonne pas
    C'est l'inverse

    Le UNION dédoublonne, le UNION ALL ne dédoublonne pas.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 766
    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 766
    Points : 52 561
    Points
    52 561
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    C'est l'inverse

    Le UNION dédoublonne, le UNION ALL ne dédoublonne pas.
    Mais ou avais-je la queue !!! ;-)
    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. Réponses: 0
    Dernier message: 04/12/2016, 09h59
  2. problème de requête avec utilisation de min/group by
    Par htristra dans le forum PostgreSQL
    Réponses: 0
    Dernier message: 02/10/2007, 13h16
  3. [SQL] Problème de requête sql utilisant LIKE
    Par yakup.67 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 06/06/2007, 13h31
  4. Réponses: 1
    Dernier message: 01/07/2006, 11h18
  5. Problème de requête avec cumul des conditions sur un champ
    Par UtopieAmbiante dans le forum Requêtes
    Réponses: 4
    Dernier message: 11/01/2006, 10h52

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