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 :

Récuper les identifiants dans un string


Sujet :

MS SQL Server

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Novembre 2011
    Messages : 13
    Points : 11
    Points
    11
    Par défaut Récuper les identifiants dans un string
    Bonjour

    Voila mon problème, je dois récupérer les 4 id's dans un string qui ressemble
    a ceci:
    40 52 36 44

    Entre les différents caractères c'est des espaces dont la longueur peut varier.

    Je pensais utiliser les fonctions left et right mais sans position fixe ...
    J'ai voulu utiliser Charindex pour rechercher les positions mais il faut spécifier un caractère préci pour la recherche or ici c'est variable (lettre ou chiffre).

    existe t'il une fonction dans sql plus adapté a ce genre de cas ou une technique de récupération ??

    Merci de votre aide
    Vincent

    La connaissance est le seul trésor qui s'enrichit en étant partagé

  2. #2
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Bonjour,

    Une solution parmi d'autres (réalisée avec une version 2008) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    DECLARE @string VARCHAR(100) = '40  52   100   1  1003 5 55 555555';
     
    WITH CTE
    AS
    (
    SELECT CAST('<a>' + REPLACE(@string, ' ', '</a><a>') + '</a>' AS XML) AS col_xml
    )
    SELECT 
     RES.value('(./text())[1]', 'VARCHAR(50)')
    FROM CTE
    CROSS APPLY col_xml.nodes('//a') AS T(RES)
    WHERE RES.value('(./text())[1]', 'VARCHAR(50)') IS NOT NULL;
    ++

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Novembre 2011
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    Bonjour mikedavem

    solution intéressante mais je ne comprend pas tout
    C'est la 2ième partie que je ne comprend pas bien avec cross apply.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT 
     RES.value('(./text())[1]', 'VARCHAR(50)')
    FROM CTE
    CROSS APPLY col_xml.nodes('//a') AS T(RES)
    WHERE RES.value('(./text())[1]', 'VARCHAR(50)') IS NOT NULL;
    2 questions annexes

    si le résultat est sous forme de linges peut on l'avoir sous forme de colonne?

    Comment peut-on utiliser le résultat dans une autre query? les colonnes n'ont pas de nom ou faut il procéder via une référence ?.

  4. #4
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    CROSS APPLY col_xml.nodes('//a') AS T(RES)
    CROSS APPLY permet de transformer chaque noeud <a> du document xml en ligne.

    si le résultat est sous forme de linges peut on l'avoir sous forme de colonne?
    Oui cela reste de la manipulation classique lorsque vous vous retrouvez avec une table relationnelle mais il faudra certainement faire cela en dynamique si vous ne connaissez pas le nombre de colonnes à l'avance. Certains diront (dont moi) que le cela reste de la cosmétique

    Comment peut-on utiliser le résultat dans une autre query? les colonnes n'ont pas de nom ou faut il procéder via une référence ?.
    Il suffit de donner à un nom à la colonne générée et l'appeler par ce nom dans votre autre requête. Dites nous ce que vous voulez faire au final.

    ++

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Novembre 2011
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    Bonjour

    Pour le petite histoire cette table contient des données que je dois récupérer pour faire un rapport. Elle est constitué de cette clé, qu'il me faut découper, et de data. J'ai donc une autre query où je dois faire le lien, via un inner join, avec cette table.

    Si vous aviez un exemple concret ou un lien vers un bon guide, ça m'aiderait beaucoup. Je ne connaït encore rien en xquery

    D'avance merci.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Novembre 2011
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    Après quelque recherche jai réussi a faire ça :

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    WITH CTE
    AS
    (
     SELECT 
      ROW_NUMBER() OVER (ORDER BY (SELECT 0)) AS num,
      CAST('<a>' + REPLACE(case when left(v5_field,1) = '' then '-1-1' + v5_field else v5_field end, '  ', '</a><a>') + '</a>' AS XML) AS col_xml
      ,v5_stock, v5_validate,v5_field
     FROM v5
    ),
    CTE2
    AS
    (
     SELECT 
       num,
       ROW_NUMBER() OVER (PARTITION BY num ORDER BY (SELECT 0)) AS num2,
       RES.value('(./text())[1]', 'VARCHAR(50)')  as valeur
        ,v5_stock, v5_validate,v5_field
      FROM CTE
      CROSS APPLY col_xml.nodes('//a') AS T(RES)
      WHERE RES.value('(./text())[1]', 'VARCHAR(50)') IS NOT NULL
      --;
    )
     
    SELECT t.num
    , t2.valeur as col1
    , t3.valeur as col2
    , t4.valeur as col3
    , t5.valeur as col5
    , t.v5_stock, t.v5_validate, t.v5_field
    FROM CTE2 AS T
    inner join CTE2 as T2 on T2.num = T.num and t2.num2 = 1
    inner join CTE2 as T3 on T3.num = T.num and t3.num2 = 2
    inner join CTE2 as T4 on T4.num = T.num and t4.num2 = 3
    inner join CTE2 as T5 on T5.num = T.num and t5.num2 = 4
    GROUP BY T.num, t2.valeur,t3.valeur,t4.valeur,t5.valeur,t.v5_stock, t.v5_validate, t.v5_field;
    et le resultat est, a première vue, correcte :
    nr_ligne;ID1;ID2;ID3;ID4;DATA1;DATA2;String_original
    27;-1-1;304;0;0;2;20.71; 304 0 0
    28;0;69;0;0;0;0;0 69 0 0

    Qu'en pensez vous ?

    merci de votre aide

  7. #7
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Comme cela difficile de vous dire ... Il faudrait nous fournir les scripts de vos tables concernés ainsi qu'un jeu d'essai (même si celui-ci est factice)

    ++

Discussions similaires

  1. [Débutant] Récuperer les entiers dans un string
    Par kevin01330 dans le forum Général Dotnet
    Réponses: 13
    Dernier message: 09/04/2013, 17h35
  2. Récuper les valeurs dans formulaire dans une table
    Par antoine1504 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 02/07/2007, 09h06
  3. récuperer les mots d'une string
    Par kwafaa dans le forum VB.NET
    Réponses: 1
    Dernier message: 09/05/2007, 13h10
  4. Réponses: 6
    Dernier message: 31/07/2006, 16h01
  5. Réponses: 7
    Dernier message: 14/09/2005, 10h50

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