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 avec Regex (extraction chaine) [Débutant(e)]


Sujet :

MS SQL Server

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 219
    Points : 121
    Points
    121
    Par défaut Select avec Regex (extraction chaine)
    Bonjour à tous,

    je dois extraire d'un champs texte certaines valeur.

    HPMOI MSWinEventLog 1 System 1333 jeu. mars 15 19:01:31 201 129 Microsoft-Windows-Time-Service AUTORITE NT\SERVICE LOCAL

    J'ai besoin de récuperer le premier mot, avant le premier espace,
    J'ai besoin aussi de récupérer la valeur après MSWinEventLog, et les 3 mots qui suivent, soit : 1 System 1333
    et enfin AUTORITE NT\SERVICE LOCAL

    J'ai pensé que la solution Regex est la bonne, mais je ne sais pas faire en Regex.

    Merci pour votre aide.
    PS : C'est bien un log windows event.

  2. #2
    Membre émérite

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Points : 2 856
    Points
    2 856
    Par défaut
    MS n'a pas encore implémenté nativement les expressions régulières dans son SGBDR. On va encore attendre les prochaines versions...

    Par contre pour ton besoin tu peux spliter ta chaîne de caractères pour récupérer ce que tu veux.

    Voici une exemple T-SQL et autre exemple avec un CLR (C#)

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 219
    Points : 121
    Points
    121
    Par défaut
    Bonjour,

    Merci ZINZINDOHOUE,

    Je viens d'essayer, mais en MS SQL 2005, les fonctions : @i +=1 ou @j -= 1

    Ne fonctionne pas

    Le principe c'est que je vais indenter i et dedenter j. Donc je dois transformer en quelque chose comme :
    SET @i = @i + 1

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 219
    Points : 121
    Points
    121
    Par défaut
    Bonjour,

    Bon j'ai trouvé comment modifier la fonction.

    Mais j'ai un problème pour l'appel de la fonction : Comment envoyer les lignes de la table.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from dbo.[F_SQLSplit]('HPMOI MSWinEventLog 1 System 1333 jeu. mars 15 19:01:31 201 129 Microsoft-Windows-Time-Service AUTORITE NT\SERVICE LOCAL',' ')  where idsplit=1
    Cela me donne la bonne information. Mais comme ces données sont stockée dans une table, je ne comprend pas comment mettre le champs de la table dans les paramètre de la fonction.

    Merci

  5. #5
    Membre émérite

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Points : 2 856
    Points
    2 856
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    create table t1 (c1 varchar(max))
    insert into t1 values ('HPMOI MSWinEventLog 1 System 1333 jeu. mars 15 19:01:31 201 129 Microsoft-Windows-Time-Service AUTORITE NT\SERVICE LOCAL')
    select * from t1  CROSS APPLY dbo.F_SQLSplit(c1,' ')

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 219
    Points : 121
    Points
    121
    Par défaut
    Re Bonjour,

    Merci pour l'instruction, Génial je ne connaissait pas l'instruction CROSS.

    Malheuresement cela ne fonctionne pas, car je crois que je suis trop gourmant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    L'instruction a été terminée. La récursivité maximale 100 a été épuisée avant la fin de l'instruction.
    Merci

  7. #7
    Membre émérite

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Points : 2 856
    Points
    2 856
    Par défaut
    OK ajoute l'option MAXRECURSION au CTE

    La valeur de cette option est comprise entre 0 et 32 767

    Voici la fonction modifiée

    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
     
    DROP FUNCTION dbo.F_SQLSplit
     
    CREATE FUNCTION [dbo].[F_SQLSplit] (@ChaineASpliter varchar(1024),@Seperateur char(1))
     
    RETURNS @T_Split TABLE (IdSplit int ,ChaineSplit varchar(1024))
     
    AS
     
    BEGIN
     
    DECLARE @i INT = 1
     
    DECLARE @j INT
     
    -- Suppression des séparateurs inutiles se trouvant au début de la chaine à spliter
     
    WHILE (SUBSTRING(@ChaineASpliter,1,1)) = @Seperateur
     
    BEGIN
     
    SET @ChaineASpliter = SUBSTRING(@ChaineASpliter,2,LEN(@ChaineASpliter)-1)
     
    SET @i = @i + 1
     
    END
     
    -- Suppression des séparateurs inutiles se trouvant à la fin de la chaine à spliter
     
    SET @j = LEN(@ChaineASpliter)
     
    WHILE (SUBSTRING(@ChaineASpliter,@j,1)) = @Seperateur
     
    BEGIN
     
    SET @ChaineASpliter = SUBSTRING(@ChaineASpliter,1,@j -1)
     
    SET @j = @j - 1
     
    END
     
    BEGIN
     
    ;WITH CTE_Split(Id, InitPosition, PositionSeparateur) AS (
     
    SELECT 1, 1, CHARINDEX(@Seperateur, @ChaineASpliter)
     
    UNION ALL
     
    SELECT id + 1, PositionSeparateur + 1, CHARINDEX(@Seperateur, @ChaineASpliter, PositionSeparateur + 1)
     
    FROM CTE_Split
     
    WHERE PositionSeparateur > 0
     
    )
     
    INSERT @T_Split(IdSplit,ChaineSplit)
     
    SELECT id,
     
    SUBSTRING(@ChaineASpliter,InitPosition,
     
    CASE
     
    WHEN PositionSeparateur > 0 THEN PositionSeparateur-InitPosition
     
    ELSE 1024
     
    END) AS Split
     
    FROM CTE_Split
    OPTION (MAXRECURSION 32767)
    RETURN;
     
    END
     
    END
     
    GO

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 219
    Points : 121
    Points
    121
    Par défaut
    Merci Beaucoup

    Cela fonctionne, il me reste plus qu'a analyser les données qui intéressent.

    Cordialement
    Cédric

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

Discussions similaires

  1. [XE] SELECT avec ORDER BY sur chaine > 1000
    Par kooky dans le forum SQL
    Réponses: 7
    Dernier message: 21/09/2010, 10h53
  2. extraire sous chaine avec regex
    Par reg01 dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 28/06/2010, 17h39
  3. regex / extraction de données dans une chaine
    Par fred6609 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 13/01/2009, 08h34
  4. Probleme de regex - extraction url avec tiret
    Par joboy84 dans le forum Langage
    Réponses: 1
    Dernier message: 01/07/2008, 20h37
  5. [Oracle] Trier avec une extraction au sein du chaine de car
    Par magic charly dans le forum Langage SQL
    Réponses: 13
    Dernier message: 14/04/2006, 15h26

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