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 23/08/2011, 20h26   #1
Invité de passage
 
Homme
Collégien
Inscription : août 2011
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Maroc

Informations professionnelles :
Activité : Collégien

Informations forums :
Inscription : août 2011
Messages : 4
Points : 1
Points : 1
Par défaut Problème avec la fonction REPLACE

Bonjour,

Je suis en train de coder un trigger qui doit entre autres se déclencher après insertion en remplaçant certains mots par d'autres dans une colonne.
Pour cela j'utilise un curseur qui charge chaque ligne de la colonne dans une variable @Adr qui est une chaîne de caractères ( varchar(100) ).
Ce que j'ai codé comme suit : replace(@Adr, 'chaîne1' , 'chaine2').
Le problème c'est que le compilateur dit qu'il y a une erreur au niveau du replace, et je n'ai aucune idée d'où ça peut venir !
Quelqu'un pourrait-il bien m'aider ??

Merci d'avance
Hanshorcan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 21h03   #2
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 520
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 520
Points : 3 968
Points : 3 968
Citation:
Envoyé par Hanshorcan Voir le message
Le problème c'est que le compilateur dit qu'il y a une erreur au niveau du replace, et je n'ai aucune idée d'où ça peut venir !
Ça pourrait aider si on avait au moins l'erreur en entier...
Parce que là, il reste juste l'option boule de cristal !
Le code in extenso et la version de bd, ça serait vraiment cool...
__________________
les règles du forum - mode d'emploi du forum
Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs.
(Rappel : "ça ne marche pas" n'est pas un message d'erreur)
JE NE RÉPONDS PAS aux questions techniques par message privé.
Écrire en français sur un forum est une marque minimale de respect.
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 22h42   #3
Invité de passage
 
Homme
Collégien
Inscription : août 2011
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Maroc

Informations professionnelles :
Activité : Collégien

Informations forums :
Inscription : août 2011
Messages : 4
Points : 1
Points : 1
Citation:
Envoyé par 7gyY9w1ZY6ySRgPeaefZ Voir le message
Ça pourrait aider si on avait au moins l'erreur en entier...
Parce que là, il reste juste l'option boule de cristal !
Le code in extenso et la version de bd, ça serait vraiment cool...
Oui d'accord désolé !
Voici mon code :

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
CREATE TRIGGER CORRECTOR2
ON BaseClients.dbo.Feuil1$
FOR UPDATE, INSERT
 
AS
 
-- Déclaration Curseur d'adresses
DECLARE CurInsBis CURSOR
FOR SELECT POLICE, ADRESSE
FROM Feuil1$
WHERE ADRESSE IS NOT NULL
IF @@ERROR <> 0 GOTO LBL_ERROR
 
-- Variables de travail
DECLARE @Adr varchar(211), @Pol varchar(55)
 
OPEN CurInsBis
IF @@ERROR <> 0 GOTO LBL_ERROR
WHILE @@FETCH_STATUS = 0
BEGIN
	IF @Adr = ' '
	BEGIN
		FETCH CurInsBis INTO @Pol, @Adr
		CONTINUE
	END
 
	REPLACE(@Adr, 'BMO', 'BORJ MOULAY OMAR')
 
 
	-- Mise à jour de la table
	UPDATE BaseClients.dbo.Feuil1$
	SET ADRESSE = @Adr 
	WHERE POLICE = @Pol
	IF @@ERROR <> 0 GOTO LBL_ERROR
	FETCH CurInsBis INTO @Pol, @Adr
END
 
-- Fermeture, libération ressources et gestion des erreurs
CLOSE CurInsBis
DEALLOCATE CurInsBis
RETURN
Je travaille sous MS SQL Server Express 2008 R2.
Merci de votre aide
Hanshorcan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 22h43   #4
Invité de passage
 
Homme
Collégien
Inscription : août 2011
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Maroc

Informations professionnelles :
Activité : Collégien

Informations forums :
Inscription : août 2011
Messages : 4
Points : 1
Points : 1
PS : le message d'erreur :

Citation:
Msg*102, Niveau*15, État*1, Procédure*CORRECTOR2, Ligne*27
Syntaxe incorrecte vers 'REPLACE'.
Msg*102, Niveau*15, État*1, Procédure*CORRECTOR2, Ligne*41
Syntaxe incorrecte vers 'RETURN'.
Hanshorcan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2011, 03h53   #5
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 520
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 520
Points : 3 968
Points : 3 968
ok, je comprend mieux.
Déjà, quand on est perdu, il est toujours bon d'aller faire un tour dans les sources, à savoir MSDN !
Tu verras dans l'article sur les triggers que le RETURN n'en fait pas parti !!!
http://msdn.microsoft.com/fr-fr/library/ms189799.aspx

Il faudrait peut-être créer où va le GOTO LBL_ERROR...
D'ailleurs c'est largement dispensable cette partie...

Pour le REPLACE, c'est une fonction !!!
http://msdn.microsoft.com/fr-fr/library/ms186862.aspx
Donc elle renvoie une valeur qu'il faut gérer donc :
Code :
1
2
 
SET @Adr = REPLACE(@Adr, 'BMO', 'BORJ MOULAY OMAR')
Pour conclure, virer cet infâme curseur, vous pouvez faire ça en une seule commande.
__________________
les règles du forum - mode d'emploi du forum
Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs.
(Rappel : "ça ne marche pas" n'est pas un message d'erreur)
JE NE RÉPONDS PAS aux questions techniques par message privé.
Écrire en français sur un forum est une marque minimale de respect.
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2011, 20h24   #6
Invité de passage
 
Homme
Collégien
Inscription : août 2011
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Maroc

Informations professionnelles :
Activité : Collégien

Informations forums :
Inscription : août 2011
Messages : 4
Points : 1
Points : 1
Merci pour ton aide
Je suis complètement passé a côté !
Le problème est résolu
Hanshorcan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2011, 21h57   #7
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 520
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 520
Points : 3 968
Points : 3 968
Votre procédure pourrait s'écrire plus simplement :
Code :
1
2
3
4
5
6
7
8
9
CREATE TRIGGER CORRECTOR2
ON BaseClients.dbo.Feuil1$
FOR UPDATE, INSERT
AS
 
UPDATE BaseClients.dbo.Feuil1$
SET ADRESSE = REPLACE(ADRESSE, 'BMO', 'BORJ MOULAY OMAR')
WHERE ADRESSE IS NOT NULL
GO
Si j'ai bien compris votre tigger va faire ça sur tous les enregistrements à chaque fois alors que vous ne devriez le faire que ceux qui ont été modifiés ou ajoutés.
Pour cela, regardez pour faire une jointure avec la table inserted :
http://msdn.microsoft.com/fr-fr/library/ms191300.aspx

Code :
1
2
3
4
5
6
7
8
9
10
11
CREATE TRIGGER CORRECTOR2
ON BaseClients.dbo.Feuil1$
FOR UPDATE, INSERT
AS
	UPDATE BDF1
	SET ADRESSE = REPLACE(ADRESSE, 'BMO', 'BORJ MOULAY OMAR')
	FROM BaseClients.dbo.Feuil1$ AS BDF1
	INNER JOIN INSERTED AS INS
		ON INS.POLICE = BDF1.POLICE
	WHERE ADRESSE IS NOT NULL
GO
Ça devrait revenir à ça, sous réserver que Police soit la clef primaire de votre table...

NOTE : Je n'ai pas testé, il y a peut-être quelques erreurs de syntaxes.
__________________
les règles du forum - mode d'emploi du forum
Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs.
(Rappel : "ça ne marche pas" n'est pas un message d'erreur)
JE NE RÉPONDS PAS aux questions techniques par message privé.
Écrire en français sur un forum est une marque minimale de respect.
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h48.


 
 
 
 
Partenaires

Hébergement Web