Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
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 02/12/2011, 13h46   #1
Membre habitué
 
Étudiant
Inscription : avril 2009
Messages : 144
Détails du profil
Informations personnelles :
Âge : 23
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2009
Messages : 144
Points : 115
Points : 115
Par défaut Problème avec CHARINDEX et SUBSTRING

Bonjour à tous,

Je vous explique mon soucis et son contexte.
J'ai actuellement une table de données à remplir ( table1 ) et une table qui contient les informations ( table2 ), le tout sous SQL Server 2008 R2

Code :
1
2
Table1 -> ID - GroupeType - MemberUser
Table2 -> ID - Message
GroupeType et MemberUser sont des informations contenues dans le champs Message de ma table2.
Les données dans ma table2 ne sont pas du tout formatées de manière à être coupées simplement. Je me dois de jongler avec la position de certaines suite de caractères.

J'ai dans mon champs message des données formatées
Code :
Blablablablablablabla Nom du compte : CN=Charles Duponts,CN=... etc ...
J'effectue une requête de traitement que voici, pour placer dans ma table1 les informations scindées de ma table2 :

Code :
1
2
3
4
UPDATE Table1
SET MemberUser = SUBSTRING(Message,CHARINDEX('Nom du compte : CN=',Message)+19,CHARINDEX(',CN=',Message)-CHARINDEX('Nom du compte : CN=',Message)-19) 
FROM Table2 
WHERE Table1.ID=Table2.ID
En gros, je recherche la position de "Nom du compte : CN=", je prends les données qui sont après, et je m'arrête au début de ",CN=". Je jongle, mais ça fonctionne !

Cependant, j'ai un gros problème. Certains enregistrements ne possèdent pas les données "Nom du compte : CN=". Et pour ces enregistrements, impossible de passer la requête en succès. J'obtiens l'erreur suivante :

Code :
1
2
Paramètre de longueur non valide passé à la fonction LEFT ou SUBSTRING.
L'instruction a été arrêtée.
Ce qui est plutôt logique. CHARINDEX me renvoie 0 car la fonction ne trouve pas la chaine demandé, et SUBSTRING ne s'effectue donc pas.
J'ai tenté de rajouter une clause
Code :
WHERE CHARINDEX(Message,"Nom du compte : CN=")!=0
Mais j'obtiens toujours une erreur.

En gros, je souhaite modifier ma requête pour qu'elle effectue le traitement sur les enregistrements qui contiennent "Nom du compte : CN=" et ignorer complètement les autres.

Des idées et/ou suggestions ?
__________________
La politesse n'a jamais tué personne
Le langage SMS c'est le mal !
Pensez au tag
ptilemare est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2011, 17h46   #2
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
Des idées et/ou suggestions ?

Faites un case WHEN dans votre requête pour gérer les lignes qui sont à traiter ou pas en fonction de la présence de 'CN='...
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2011, 19h25   #3
Membre régulier
 
Homme
Consultant en Business Intelligence
Inscription : décembre 2005
Messages : 178
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Maroc

Informations professionnelles :
Activité : Consultant en Business Intelligence

Informations forums :
Inscription : décembre 2005
Messages : 178
Points : 99
Points : 99
Envoyer un message via MSN à warning Envoyer un message via Yahoo à warning
mets une clause de type
WHERE contains(Message,"Nom du compte : CN=")

comme ca tu n’exécutera ton update que sur le contenu concerné.
warning est dé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 15h11.


 
 
 
 
Partenaires

Hébergement Web