Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server
MS SQL-Server Forum Microsoft SQL-Server. Avant de poster -> FAQ SQL-Server, Tutoriels SQL-Server
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 22/12/2011, 15h43   #1
Invité de passage
 
Homme Vincent
Développeur .NET
Inscription : novembre 2011
Messages : 10
Détails du profil
Informations personnelles :
Nom : Homme Vincent
Localisation : Belgique

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

Informations forums :
Inscription : novembre 2011
Messages : 10
Points : 1
Points : 1
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é
Tazze-99 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2011, 16h22   #2
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 724
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 724
Points : 6 848
Points : 6 848
Bonjour,

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

Code :
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;
++
mikedavem est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/12/2011, 17h22   #3
Invité de passage
 
Homme Vincent
Développeur .NET
Inscription : novembre 2011
Messages : 10
Détails du profil
Informations personnelles :
Nom : Homme Vincent
Localisation : Belgique

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

Informations forums :
Inscription : novembre 2011
Messages : 10
Points : 1
Points : 1
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 :
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 ?.
Tazze-99 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2011, 17h50   #4
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 724
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 724
Points : 6 848
Points : 6 848
Citation:
CROSS APPLY col_xml.nodes('//a') AS T(RES)
CROSS APPLY permet de transformer chaque noeud <a> du document xml en ligne.

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

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

++
mikedavem est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2011, 10h43   #5
Invité de passage
 
Homme Vincent
Développeur .NET
Inscription : novembre 2011
Messages : 10
Détails du profil
Informations personnelles :
Nom : Homme Vincent
Localisation : Belgique

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

Informations forums :
Inscription : novembre 2011
Messages : 10
Points : 1
Points : 1
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.
Tazze-99 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/12/2011, 15h50   #6
Invité de passage
 
Homme Vincent
Développeur .NET
Inscription : novembre 2011
Messages : 10
Détails du profil
Informations personnelles :
Nom : Homme Vincent
Localisation : Belgique

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

Informations forums :
Inscription : novembre 2011
Messages : 10
Points : 1
Points : 1
Après quelque recherche jai réussi a faire ça :

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
 
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
Tazze-99 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/12/2011, 17h13   #7
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 724
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 724
Points : 6 848
Points : 6 848
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)

++
mikedavem est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h49.


 
 
 
 
Partenaires

Hébergement Web