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 :

Découper une chaine séparée par des ; SQL SERVER 2005 express


Sujet :

Développement SQL Server

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Avril 2004
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Découper une chaine séparée par des ; SQL SERVER 2005 express
    table 1 :J'ai une 1er table dont les colonnes sont un TIMESTAMP datetime, un STRING varchar et autres qui ne m'interrressent pas
    ID TIMESTAMP flag1 flag2 STRING flag status
    1 04/11/2008 17:23:05 0 0 12;124;000012.400000;000001.000000;000000.000000;000000.000000;000000.000000;000000.000000;H;-000000.997558 { } {ok}
    2 04/11/2008 17:23:10 0 0 13;125;000012.400000;000001.000000;000000.000000;000000.000000;000000.000000;000000.000000;H;-000000.996337 { } {ok}
    3 04/11/2008 17:23:15 0 0 ;;000012.400000;000001.000000;000000.000000;000000.000000;000000.000000;000000.000000;H;-000000.997558 { } {ok}
    4 04/11/2008 17:23:20 0 0 ;;000012.400000;000001.000000;000000.000000;000000.000000;000000.000000;000000.000000;H;-000000.997558 { } {ok}
    5 04/11/2008 17:23:25 0 0 ;;000012.400000;000001.000000;000000.000000;000000.000000;000000.000000;000000.000000;H;-000000.997558 { } {ok}
    6 04/11/2008 17:23:30 0 0 ;;000012.400000;000001.000000;000000.000000;000000.000000;000000.000000;000000.000000;H;-000000.997558 { } {ok}
    7 04/11/2008 17:23:35 0 0 ;;000012.400000;000001.000000;000000.000000;000000.000000;000000.000000;000000.000000;H;-000000.996337 { } {ok}

    Table 3 (final) J'ai besoin de faire une autre table en éclatant la valeur STRING en plusieurs colonnes comme suivant
    TIMESTAMP val1 val2 val3 val4 val5 val6 val7 val8 val9 val10
    04/11/2008 17:23:05 12 124 000012.400000 000001.000000 000000.000000 000000.000000 000000.000000 000000.000000 H -000000.997558
    04/11/2008 17:23:10 13 125 000012.400000 000001.000000 000000.000000 000000.000000 000000.000000 000000.000000 H -000000.996337
    04/11/2008 17:23:15 NULL NULL 000012.400000 000001.000000 000000.000000 000000.000000 000000.000000 000000.000000 H -000000.996337
    04/11/2008 17:23:20 NULL NULL 000012.400000 000001.000000 000000.000000 000000.000000 000000.000000 000000.000000 H -000000.996337
    04/11/2008 17:23:25 NULL NULL 000012.400000 000001.000000 000000.000000 000000.000000 000000.000000 000000.000000 H -000000.996337
    04/11/2008 17:23:30 NULL NULL 000012.400000 000001.000000 000000.000000 000000.000000 000000.000000 000000.000000 H -000000.996337
    04/11/2008 17:23:35 NULL NULL 000012.400000 000001.000000 000000.000000 000000.000000 000000.000000 000000.000000 H -000000.996337
    D'autre par la table 1 évolue en permanance, je dois donc ajouter que les nouveaux enregistrement dans la table 3 à chaque évolution de la table 1
    la table 2 est une table temporaire de travail

    j'ai fais bcp de tests mais sans résultat positif voici le dernier en date

    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
     
    DECLARE @var1 varchar(20), @var2 varchar(20), @var3 varchar(20), @var4 varchar(20), @var5 varchar(20), @var6 varchar(20), @var7 varchar(20), @var8 varchar(20), @var9 varchar(20), @var10 varchar(20),@separateur varchar(1);
    DECLARE @position_p int;
    DECLARE @position_s int;
    DECLARE @cpt int;
     
    SET @position_p=1;
    SET @position_s=1;
    SET @var1='';
    SET @var2='';
    SET @var3='';
    SET @var4='';
    SET @var5='';
    SET @var6='';
    SET @var7='';
    SET @var8='';
    SET @var9='';
    SET @var10='';
     
    SET @separateur=';';
     
    SET @cpt=1;
     
    drop table #table2
     
    create table #table2 (temps datetime, valeur varchar(250))
     
     
    insert into #table2 SELECT B.TIMESTAMP ,B.VALUE  from master.dbo.table1 B
    WHERE (B.TIMESTAMP>(select TOP(1) table3.TIMESTAMP 
                        from table3 ORDER table3.TIMESTAMP DESC))
            OR ((select TOP(1) table3.TIMESTAMP 
            from table3 ORDER BY table3.TIMESTAMP DESC) IS NULL)
     
    declare curseur CURSOR for SELECT * from #table2
    OPEN curseur
    FETCH curseur into @var1, @var2
     
    while @@FETCH_STATUS =0
    begin
        while @cpt<=10
            begin
     
                SELECT @position_s = charindex(@separateur,valeur,@position_p)from #table2
     
                IF @cpt=1 
                begin
                    IF @position_s = @position_p + 1
                    SET @var1 = NULL;
                    ELSE 
                    SELECT @var1 = SUBSTRING (valeur,@position_p, @position_s - @position_p)from #table2
                end
                IF @cpt=2 
                begin
                    IF @position_s = @position_p + 1
                    SET @var2 = NULL;
                    ELSE 
                    SELECT @var2 = SUBSTRING (valeur,@position_p, @position_s - @position_p)from #table2
                end
     
                SET    @position_p = @position_s + 1
                SET @cpt = @cpt + 1
            end
     
    select temps,@var1,@var2 from #table2
     
    FETCH NEXT from curseur
    end
     
    CLOSE curseur
    DEALLOCATE curseur

  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 770
    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 770
    Points : 52 723
    Points
    52 723
    Billets dans le blog
    5
    Par défaut
    Une seule requête SQL suffit à traiter votre problème. Inspirez vous de ce qu'a posté elsuket sur son blog a ce sujet (mais version 2005) sinon de ce que j'ai posté hier sur le forum SQL :
    http://blog.developpez.com/elsuket?t...cte_recursives
    http://www.developpez.net/forums/d63...itement-batch/

    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
    Nouveau Candidat au Club
    Inscrit en
    Avril 2004
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 2
    Points : 1
    Points
    1
    Par défaut extraire des valeurs d'une chaine séparée par des ; de la table
    Bonjour,
    Je me suis déjà inspiré de son code mais comme vous le résultat est rangé dans une seule colonne or je dois mettre chaque sous chaine extraite comme nouvelle colonne d'1 autre table c.a.d que le résultat serait le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    MEMO				val1		val2		val3		val4		val5
    C.J90.CV2.CAM1.CDEA		C		J90		CV2		CAM1		CDEA
    D.JF36.CB142.SDF.ZE		D		JF36		CB142		SDF		ZE
    sachant que je n'ai pas plus de 10 valeurs et que la taille de chaque valeur peut être de 1 à 15 caractères
    A+

Discussions similaires

  1. Réponses: 7
    Dernier message: 27/02/2015, 15h02
  2. Découper une chaine ligne par ligne
    Par freud dans le forum Langage
    Réponses: 2
    Dernier message: 24/11/2011, 13h17
  3. Découper une chaine séparée par des séparateur ;
    Par d.tellier dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 23/12/2010, 18h21
  4. Réponses: 1
    Dernier message: 09/09/2006, 21h52
  5. [SQL server 2005 express] liste des erreurs SQL serveur 2005
    Par critok dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 02/05/2006, 19h17

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