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 :

SQL XML NODES [2014]


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Octobre 2002
    Messages : 80
    Points : 47
    Points
    47
    Par défaut SQL XML NODES
    Bonjour,

    Je reçois une liste en XML à placer en base.

    bref je ne maitrise pas les sources et certaines ont les noeuds en majuscule et d'autres en minuscule
    voilà le type de noeuds

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <SMS>
      <ID2>48c40c58-8eef-11e6-b3c7-1231420104ed</ID2>
      <TEL>xxxxxx</TEL>
      <MSG>Le message</MSG>
    </SMS>
    <SMS>
      <ID2>56c40c58-8eef-11e6-b3c7-1231420104aa</ID2>
      <TEL>xxxxxx</TEL>
      <MSG>Le message</MSG>
    </SMS>


    aujourd'hui je fais comme ça.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	select
    		t.x.value('ID2[1]','varchar(50)') as ID2,
    		t.x.value('TEL[1]','varchar(50)') as TEL,
    		t.x.value('MSG[1]','varchar(max)') as MSG
    	from @INFOS_XML.nodes('/SMS') t(x)

    mais comme on peut le voir je suis obligé de préciser mes noeuds en MAJ
    j'ai essayé en minuscule comme ça par exemple t.x.value('id2[1]','varchar(50)') as ID2mais du coup il retrouve rien bien évidemment, comment faire pour ne pas tenir compte de la casse sur les noeuds ?

    je ne peux pas passer tout le flux en min ou maj car la casse du message ou de l'id ne doit pas être perdue.

    Merci de vos idées.
    cH.
    -> SGBR=SQL SERVER 2014 <-

  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 768
    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 768
    Points : 52 719
    Points
    52 719
    Billets dans le blog
    5
    Par défaut
    Le langage XML est un langage sensible à la casse. Une balise en majuscule n'est pas la même qu'une balise en minuscule. Si tel est le cas de vos document, ceux qui vous les envoient ne respectent pas leurs propres référentiel.... Réglez le problème en amont, ou écrivez autant de requête que de casse ou encore, utilisez les fonction UPPER / LOWER.

    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
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Octobre 2002
    Messages : 80
    Points : 47
    Points
    47
    Par défaut
    Bonjour Fred,

    Merci pour ces infos, toutefois comme je l'ai dit je ne maîtrise pas les sources et elles sont multiples, j'ai volontairement simplifié l'exemple, de plus certains développeurs ne font plus partis de la boite.
    Je pense que vu votre parcours vous avez déjà rencontré ça en entreprise.

    J'ai bien pensé à gérer la casse sur l'ensemble du flux (variable) mais du coup ça joue sur les valeurs, alors que ma recherche se porte plutôt sur les nœuds eux mêmes.
    J'avoue que je ne connait pas assez le XML et toutes ses possibilités dans SQL...


    Je suis preneur d'idées...
    cH.
    -> SGBR=SQL SERVER 2014 <-

  4. #4
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 541
    Points
    10 541
    Billets dans le blog
    21
    Par défaut
    Bonjour,

    Effectivement, le XML est sensible à la casse. Ce n'est donc pas SQLServer qui va vous aider à ce niveau là. Il faut traiter le flux avant de l'envoyer en traitement.

    Comme le flux est traité par SQLServer, je suppose que tu envoies tout d'un coup. Aussi, avec 2 expressions régulières bien choisie (une pour les tags ouvrant, l'autre pour les tags fermant), il sera possible de ne mettre à jour que les tags, et pas l'intégralité du flux.

    Ou sinon il y a la possibilité de parser le document XML, de mettre en majuscule tous les tags avant d'écrire un nouveau document XML et d'envoyer ce nouveau document vers SQLServer. Mais je pense que ce sera plus lourd à mettre en oeuvre que de simples regex.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  5. #5
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Octobre 2002
    Messages : 80
    Points : 47
    Points
    47
    Par défaut
    Oui je pensais partir par là en dernière option... :/
    Comme j'ai vu que dans les fonction XML de sql y'avait fn:lower-case, etc... je me suis dit qu'il y avait peut être un moyen de modifier les noeuds.
    je crains un peu la lourdeur mais je risque de ne pas avoir trop le choix, même si effectivement la logique voudrait de changer tout ça en amont.

    Merci en tout cas je vais voir si je trouve un truc côté expressions régulières, qui pourrait me servir.
    -> SGBR=SQL SERVER 2014 <-

  6. #6
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 541
    Points
    10 541
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par Troyan Voir le message
    Comme j'ai vu que dans les fonction XML de sql y'avait fn:lower-case
    Ces fonctions sont faites pour agir sur les données, pas sur la structure du XML. J'ai bien peur qu'elles ne soient pas d'une grande utilité ici.

    Maintenant, après de longues réflexions, il est peut-être possible de les utiliser, mais :
    • cela va rendre la requête difficile lisible ;
    • cela va nuire grandement aux performances.


    En XPATH, tu peux récupérer le nom d'un tag via name(). Tu peux donc appliquer la fonction fn:lower-case.

    Code SQL : 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 @INFOS_XML XML = N'<Sms>
      <ID2>48c40c58-8eef-11e6-b3c7-1231420104ed</ID2>
      <TEL>xxxxxx</TEL>
      <MSG>Le message</MSG>
    </Sms>
    <SMS>
      <ID2>56c40c58-8eef-11e6-b3c7-1231420104aa</ID2>
      <TEL>xxxxxx</TEL>
      <MSG>Le message</MSG>
    </SMS>';
     
    select
    		t.x.value('ID2[1]','varchar(50)') as ID2,
    		t.x.value('TEL[1]','varchar(50)') as TEL,
    		t.x.value('MSG[1]','varchar(max)') as MSG
    	from @INFOS_XML.nodes('/*[fn:lower-case(local-name())="sms"]') t(x)
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  7. #7
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Octobre 2002
    Messages : 80
    Points : 47
    Points
    47
    Par défaut
    Merci dorinf,

    c'est exactement ça, je verrais si je peux faire quelques tests avant afin de rentrer dans cette branche vs l'original.
    mais dans ton exemple cela se comporte très bien, sur le pire volume que j'ai c'est plutot une bonne chose

    Si je peux abusé je n'arrive pas a recopier ta fonction au niveau du select sur les 3 balises ID2, TEL, MSG
    as tu moyen de me donner un exemple ?
    ou de la doc pour savoir comment l'ecrire ?

    c'est clair que le XML n'est pas des plus intuitif
    -> SGBR=SQL SERVER 2014 <-

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    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 768
    Points : 52 719
    Points
    52 719
    Billets dans le blog
    5
    Par défaut
    Le mieux serait quand même de rectifier les doc XML avant intégration via SSIS par exemple.

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

  9. #9
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Octobre 2002
    Messages : 80
    Points : 47
    Points
    47
    Par défaut
    en fait c'est une procédure stockée elle est appelée directement via web , api, exe ...
    c'est pour ça, que je ne maitrise pas la source, et c'est pas des fichiers sinon j'aurais pu travaillé directement dessus.

    Le risque est faible en vrai, mais il suffit que ça tombe sur le cas "touchy", je préfère être pro-actif quand je vois le futur problème arriver.
    d'ou ma question sur le forum parce que je ne voyait pas vraiment comment faire sans que ça soit "crade".

    cH.
    -> SGBR=SQL SERVER 2014 <-

  10. #10
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 541
    Points
    10 541
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par Troyan Voir le message
    en fait c'est une procédure stockée elle est appelée directement via web , api, exe ...
    c'est pour ça, que je ne maitrise pas la source, et c'est pas des fichiers sinon j'aurais pu travaillé directement dessus.
    Tu peux définir un schéma XML et typer ton paramètre XML à l'aide de ce schéma. En gros, cela veut dire que ta procédure stockée n'acceptera que des données XML respectant le schéma. Si ce n'est pas le cas, la procédure ne sera pas exécutée et une erreur sera générée.
    Cela forcera les utilisateurs a utiliser correctement ta procédure.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  11. #11
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Octobre 2002
    Messages : 80
    Points : 47
    Points
    47
    Par défaut
    Je vois le principe mais ça passera jamais ça va me revenir en boomerang direct.

    mais ce que tu m'as donné tout à l'heure a l'air de bien se présenter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select
    		t.x.value('ID2[1]','varchar(50)') as ID2,
    		t.x.value('TEL[1]','varchar(50)') as TEL,
    		t.x.value('MSG[1]','varchar(max)') as MSG
    	from @INFOS_XML.nodes('/*[fn:lower-case(local-name())="sms"]') t(x)
    sais tu comment je peux ecrite la partie en rouge dans le select pour appliquer la même chose sur ID2, TEL, MSG ??

    merci par avance
    cH.
    -> SGBR=SQL SERVER 2014 <-

  12. #12
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 541
    Points
    10 541
    Billets dans le blog
    21
    Par défaut
    Code SQL : 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 @INFOS_XML XML = N'<Sms>
      <Id2>48c40c58-8eef-11e6-b3c7-1231420104ed</Id2>
      <TEL>xxxxxx</TEL>
      <MSG>Le message</MSG>
    </Sms>
    <SMS>
      <ID2>56c40c58-8eef-11e6-b3c7-1231420104aa</ID2>
      <TEL>xxxxxx</TEL>
      <MSG>Le message</MSG>
    </SMS>';
     
    select
    		t.x.value('(*[fn:lower-case(local-name())="id2"]/text())[1]','varchar(50)') as ID2,
    		t.x.value('TEL[1]','varchar(50)') as TEL,
    		t.x.value('MSG[1]','varchar(max)') as MSG
    	from @INFOS_XML.nodes('/*[fn:lower-case(local-name())="sms"]') t(x)

    Je l'ai fait pour un élément. Je te laisse faire les autres
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  13. #13
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Octobre 2002
    Messages : 80
    Points : 47
    Points
    47
    Par défaut
    Génial Merci.
    Je pense que je vais pouvoir m'en sortir.
    -> SGBR=SQL SERVER 2014 <-

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

Discussions similaires

  1. Requeter Mysql sans passer par du sql -xml?-
    Par Malone dans le forum Bases de données
    Réponses: 2
    Dernier message: 22/08/2006, 14h02
  2. Requeter Mysql sans passer par du sql -xml?-
    Par Malone dans le forum Delphi
    Réponses: 2
    Dernier message: 22/08/2006, 14h02
  3. [SQL] [XML/PHP/SQL]exploiter au mieux un fichier text
    Par freija dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 26/07/2006, 11h38
  4. Réponses: 1
    Dernier message: 29/12/2005, 09h37
  5. [JDOM] XML Node JDOM
    Par quidam66 dans le forum Format d'échange (XML, JSON...)
    Réponses: 7
    Dernier message: 14/09/2005, 23h15

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