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
Citation:
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
Citation:
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:
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 |
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:
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+