OVH Cloud OVH Cloud

creer un curseur

5 réponses
Avatar
chris81
bonjour,
je souhaite creer un curseur pour faire la mise à jour d'une reference.
j'ai une table [Stock MP] avec des references commencant par ESN001 ou
E0002... j'aimerai mettre les references comme EM0001, EM0002 .... pour
cela j'ai pensé à un curseur du style

begin transaction

DECLARE C_ech CURSOR
FOR
SELECT [Référence]
FROM [stock matières premières]
WHERE [référence] like 'E%'

OPEN C_ech
DECLARE @i int

set @i=1

WHILE @@FETCH_STATUS = 0
BEGIN
update [stock matières premières] set [référence] = 'EM' + right('000'
+ @i,4);
set @i = @i+1
END

rollback
commit

Comment puis je faire pour qu'il me balaie chaque ligne et me change la
reference en EM.... Avec cette instruction il me change toute les
reference en EM0001.

Une solution?? merci

5 réponses

Avatar
Med Bouchenafa
inutile de faire un curseur

UPDATE [stock matières premières]
SET [référence] = 'EM0' + RIGHT(référence, 3)
WHERE [référence] LIKE 'ESN%';

UPDATE [stock matières premières]
SET [référence] = 'EM0' + RIGHT(référence, 3)
WHERE [référence] LIKE 'E0%';


--
Bien cordialement
Med Bouchenafa

"chris81" wrote in message
news:
bonjour,
je souhaite creer un curseur pour faire la mise à jour d'une reference.
j'ai une table [Stock MP] avec des references commencant par ESN001 ou
E0002... j'aimerai mettre les references comme EM0001, EM0002 .... pour
cela j'ai pensé à un curseur du style

begin transaction

DECLARE C_ech CURSOR
FOR
SELECT [Référence]
FROM [stock matières premières]
WHERE [référence] like 'E%'

OPEN C_ech
DECLARE @i int

set @i=1

WHILE @@FETCH_STATUS = 0
BEGIN
update [stock matières premières] set [référence] = 'EM' + right('000' +
@i,4);
set @i = @i+1
END

rollback
commit

Comment puis je faire pour qu'il me balaie chaque ligne et me change la
reference en EM.... Avec cette instruction il me change toute les
reference en EM0001.

Une solution?? merci




Avatar
chris81
Il se trouve que Med Bouchenafa a formulé :
inutile de faire un curseur

UPDATE [stock matières premières]
SET [référence] = 'EM0' + RIGHT(référence, 3)
WHERE [référence] LIKE 'ESN%';

UPDATE [stock matières premières]
SET [référence] = 'EM0' + RIGHT(référence, 3)
WHERE [référence] LIKE 'E0%';


--
Bien cordialement
Med Bouchenafa

"chris81" wrote in message
news:
bonjour,
je souhaite creer un curseur pour faire la mise à jour d'une reference.
j'ai une table [Stock MP] avec des references commencant par ESN001 ou
E0002... j'aimerai mettre les references comme EM0001, EM0002 .... pour
cela j'ai pensé à un curseur du style

begin transaction

DECLARE C_ech CURSOR
FOR
SELECT [Référence]
FROM [stock matières premières]
WHERE [référence] like 'E%'

OPEN C_ech
DECLARE @i int

set @i=1

WHILE @@FETCH_STATUS = 0
BEGIN
update [stock matières premières] set [référence] = 'EM' + right('000' +
@i,4);
set @i = @i+1
END

rollback
commit

Comment puis je faire pour qu'il me balaie chaque ligne et me change la
reference en EM.... Avec cette instruction il me change toute les reference
en EM0001.

Une solution?? merci







merci
Avatar
Christian
Med Bouchenafa a écrit :
inutile de faire un curseur

UPDATE [stock matières premières]
SET [référence] = 'EM0' + RIGHT(référence, 3)
WHERE [référence] LIKE 'ESN%';

UPDATE [stock matières premières]
SET [référence] = 'EM0' + RIGHT(référence, 3)
WHERE [référence] LIKE 'E0%';




en fait si j'ai besoin d'un curseur car defois j'ai ESN01, ESN002...
Avatar
Fred BROUARD
Utilisez WHERE CURRENT OF dans l'update :

------------------------------------------------------

BEGIN TRANSACTION

DECLARE C_ECH CURSOR
FOR
SELECT [Référence]
FROM [stock matières premières]
WHERE [référence] like 'E%'

OPEN C_ECH

DECLARE @i int

set @i=1

WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE [stock matières premières]
SET [référence] = 'EM' + right('000' + @i, 4)
WHERE CURRENT OF C_ECH
IF @@ERROR <> 0 GOTO LBL_ERROR

SET @i = @i+1
END

COMMIT TRANSACTIONS

GOTO LBl_RESUME

LBL_ERROR:

ROLLBACK TRANSACTION

LBL_RESUME:

DEALLOCATE C_ECH

CLOSE C_ECH

------------------------------------------------------

Au passage il est FORTEMENT déconseillé d'utiliser des caractères
diacritiques et des espaces dans des noms d'objets. Cela est interdit
par la norme et certains logiciels ne les accemptents pas.
Vous courrez donc au devant d'ennuis avec de tels noms.

A +


--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************



chris81 a écrit :
bonjour,
je souhaite creer un curseur pour faire la mise à jour d'une reference.
j'ai une table [Stock MP] avec des references commencant par ESN001 ou
E0002... j'aimerai mettre les references comme EM0001, EM0002 .... pour
cela j'ai pensé à un curseur du style

begin transaction

DECLARE C_ech CURSOR
FOR
SELECT [Référence]
FROM [stock matières premières]
WHERE [référence] like 'E%'

OPEN C_ech
DECLARE @i int

set @i=1

WHILE @@FETCH_STATUS = 0
BEGIN
update [stock matières premières] set [référence] = 'EM' +
right('000' + @i,4);
set @i = @i+1
END

rollback
commit

Comment puis je faire pour qu'il me balaie chaque ligne et me change la
reference en EM.... Avec cette instruction il me change toute les
reference en EM0001.

Une solution?? merci




Avatar
Christian
Fred BROUARD a écrit :
Utilisez WHERE CURRENT OF dans l'update :

------------------------------------------------------

BEGIN TRANSACTION

DECLARE C_ECH CURSOR
FOR
SELECT [Référence]
FROM [stock matières premières]
WHERE [référence] like 'E%'

OPEN C_ECH

DECLARE @i int

set @i=1

WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE [stock matières premières]
SET [référence] = 'EM' + right('000' + @i, 4)
WHERE CURRENT OF C_ECH
IF @@ERROR <> 0 GOTO LBL_ERROR

SET @i = @i+1
END

COMMIT TRANSACTIONS

GOTO LBl_RESUME

LBL_ERROR:

ROLLBACK TRANSACTION

LBL_RESUME:

DEALLOCATE C_ECH

CLOSE C_ECH

------------------------------------------------------

Au passage il est FORTEMENT déconseillé d'utiliser des caractères
diacritiques et des espaces dans des noms d'objets. Cela est interdit
par la norme et certains logiciels ne les accemptents pas.
Vous courrez donc au devant d'ennuis avec de tels noms.

A +




je sais mais je reprend de l'existant et je suis le 1° à en patir...