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 :

Extractions dans une chaîne de longueur variable. [2008R2]


Sujet :

Développement SQL Server

  1. #1
    Membre régulier
    Inscrit en
    Juillet 2003
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 207
    Points : 85
    Points
    85
    Par défaut Extractions dans une chaîne de longueur variable.
    Bonjour,

    Je souhaiterais extraire d'une chaîne de longueur variable, des valeurs qui ne sont pas toujours forcément à la même position mais entouré de texte toujours identique.

    Je m'explique.. Par exemple dans cette chaîne de caractères contenue dans le champ "Message":

    "Document 195, Print Document owned by T5346561 on A25LT60706 was printed on A25PRSGR through port secure2. Size in bytes: 188866. Pages printed: 1. No user action is required."

    Je voudrais via un Select sur le champ "Message" récupérer :
    - La valeur entouré de 'by' et 'on' --> T5346561
    - La valeur entouré de 'on ' et 'through ' --> A25PRSGR
    - La valeur entouré de 'printed:' et '. No' --> 1

    Merci d'avance de votre aide.

    David

  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,

    sur le principe, selon l'exemple donné :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    DECLARE @x varchar(500)
    SET @x = 'Document 195, Print Document owned by T5346561 on A25LT60706 was printed on A25PRSGR through port secure2. Size in bytes: 188866. Pages printed: 1. No user action is required.'
     
    SELECT @x
    	   , SUBSTRING(@x, CHARINDEX('by', @x) + 3,  CHARINDEX('on', @x) - CHARINDEX('by', @x) - 3)
    	   , SUBSTRING(@x, CHARINDEX('on', @x,  CHARINDEX('on', @x) + 1) + 3,  CHARINDEX('through', @x) - CHARINDEX('on', @x,  CHARINDEX('on', @x) + 1) - 3)
       	   , SUBSTRING(@x, CHARINDEX('printed:', @x) + 9,  CHARINDEX('. No', @x) - CHARINDEX('printed:', @x) - 9)
    mais, ce n'est pas vraiment le type de tache pour lequel SQL est conçu, et risquera de mal fonctionner sur différents textes (par exemple, présence des mots clefs supplémentaires dans les partie variables, comme on nom de login/machine contenant "ON")
    quel est le contexte ?
    jusqu’à quel point le texte peut varier ?

  3. #3
    Membre régulier
    Inscrit en
    Juillet 2003
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 207
    Points : 85
    Points
    85
    Par défaut
    Merci aieeeuuuuu !
    Cela fonctionne très bien.
    J'admet que normalement SQL ne devrait pas à avoir faire cela.

    En fait j'ai un script Powershell qui exporte les événements d'impression du serveur dans une table de notre SQL Server.
    Il y a 2 champs dans cette table: La date de l’événement et le message qui contient les informations dont j'ai besoin (User, Imprimante, nb de pages imprimés)

    Logiquement il ne risque pas d'y avoir le mot 'on' dans les différentes valeurs variables (User ou Imprimante)
    Mais si je veux pousser un peu plus un sécurité à ce niveau là, est-il possible de plutôt indiquer 'printed on' comme chaîne avant la chaîne que je dois récupérer ?
    Et si oui dans ce cas, est ce que cela change le reste des instructions qui isole ce que l'on veut garder ? (j'avoue ne pas bien comprendre le fonctionnement des CHARINDEX)

    J'abuse mais est-ce que je peux te demander ce que je dois rajouter au 3ème SUBSTRING concernant le nom de pages imprimés pour le convertir en numérique afin de pouvoir effectuer des calculs dessus.

    En tout cas un grand merci.

  4. #4
    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
    oui, il serait préférable de mettres des bornes plus grandes afin de réduire le risque d'erreur.
    Le principe reste le même, il suffit de modifier les déplacement que j'ai mis en dur en fonction du nombre de lettre dans la nouvelle borne (+3, +9, ...)

    CHARINDEX renvoi la position de la première occurrence du premier paramètre trouvée dans le deuxième paramètre, en commençant la recherche à partir de la position indiquée par le troisième paramètre (optionnel).


    Pour transtyper le résultat en numérique, il suffit d'utiliser la fonction CAST

  5. #5
    Membre régulier
    Inscrit en
    Juillet 2003
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 207
    Points : 85
    Points
    85
    Par défaut
    Super !!

    Merci beaucoup pour ton aide.

    Tout est ok .

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

Discussions similaires

  1. [XL-2007] Valeur textbox dans une colonne de longueur variable
    Par luko6 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 22/10/2009, 14h42
  2. [BO 5.1] Extraction dans une chaîne de caractères
    Par ruton dans le forum Débuter
    Réponses: 2
    Dernier message: 22/03/2008, 15h06
  3. Réponses: 2
    Dernier message: 19/04/2007, 15h26
  4. Extraction de variables dans une chaîne
    Par Spack dans le forum Général Python
    Réponses: 6
    Dernier message: 20/05/2006, 19h42
  5. Peut-on inclure une variable dans une chaîne SQL ?
    Par beegees dans le forum Langage SQL
    Réponses: 2
    Dernier message: 29/03/2006, 11h31

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