OVH Cloud OVH Cloud

LOOP

6 réponses
Avatar
Kigner
Bien le bonjour !
qui sais comment r=E9aliser un "LOOP" en SQL2000
afin de r=E9aliser une requ=EAte 11 millions de fois ???

par avance merci!
salutations,
Daniel

6 réponses

Avatar
Vuillermet Jacques
"11 millions de fois" c'est justement le signal qui doit te faire dire :
"Pas de boucle !".
Sous peine de temps d'exécution pénible.

Si tu ne peux vraiment vraiment vraiment vraiment vraiment vraiment vraiment
pas faire autrement alors vois l'instruction WHILE dans doc.

Jacques.


"Kigner" a écrit dans le message de
news: 210c901c459c5$7faa8ed0$
Bien le bonjour !
qui sais comment réaliser un "LOOP" en SQL2000
afin de réaliser une requête 11 millions de fois ???

par avance merci!
salutations,
Daniel
Avatar
Merci Jacques... C'est vrai que c'est paradoxal de devoir
executer une commande 11 millions de fois...

Faudrait-il executer ma requête avec un cursor ?

voici ma requete:

CREATE PROCEDURE usp_clean_pemontag AS
DECLARE @execstr_del varchar(100),@deleted_isn numeric(10)

DECLARE commandes CURSOR FOR
select top 1 pemontag_isn
from pemontag_tvx3
OPEN commandes

FETCH commandes INTO @deleted_isn

SET @execstr_del='delete from pemontag where
pemontag_isn='+convert(varchar,@deleted_isn)
begin TRAN
EXEC(@execstr_del)
commit TRAN
--PRINT CHAR(13)+'status 1: '+convert
(varchar,@@FETCH_STATUS)
CLOSE commandes
DEALLOCATE commandes

SET @execstr_del='delete from pemontag_tvx3 where
pemontag_isn='+convert(varchar,@deleted_isn)
--PRINT CHAR(13)+@execstr_del

EXEC(@execstr_del)
--PRINT CHAR(13)+'status 2: '+convert
(varchar,@@FETCH_STATUS)

commit

RETURN @deleted_isn
GO
Avatar
Fred BROUARD
Beaucoup d'horreur dans ce code :
1) pas besoin d'utiliser un curseur
2) clause top sans order by
3) gestion de transaction plus que hasardeuse

Et a mon avis pas besoin d'exécuter cela 11 millions de fois en imbriauant les requêtes... Que veut tu faire exactement ???

voici le code corrigé :

CREATE PROCEDURE usp_clean_pemontag
AS

DECLARE @deleted_isn numeric(10)

BEGIN TRANSACTION

SELECT TOP 1 @deleted_isn = pemontag_isn
FROM pemontag_tvx3
ORDER BY 1
IF @@ERROR <> 0
GOTO LBL_ERROR

DELETE FROM pemontag
WHERE pemontag_isn = @deleted_isn
IF @@ERROR <> 0
GOTO LBL_ERROR

DELETE FROM pemontag_tvx3
WHERE pemontag_isn = @deleted_isn
IF @@ERROR <> 0
GOTO LBL_ERROR

SELECT @deleted_isn

COMMIT TRANSACTION

RETURN

LBL_ERROR:

ROLLBACK TRANSACTION

GO

A +


PS : il me parait nécessaire que tu te forme à Transact SQL...
Pour débuter : http://sqlpro.developpez.com/TransactSQL/SQL_MSTransactSQL.html

--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************


a écrit:
Merci Jacques... C'est vrai que c'est paradoxal de devoir
executer une commande 11 millions de fois...

Faudrait-il executer ma requête avec un cursor ?

voici ma requete:

CREATE PROCEDURE usp_clean_pemontag AS
DECLARE @execstr_del varchar(100),@deleted_isn numeric(10)

DECLARE commandes CURSOR FOR
select top 1 pemontag_isn
from pemontag_tvx3
OPEN commandes

FETCH commandes INTO @deleted_isn

SET @execstr_del='delete from pemontag where
pemontag_isn='+convert(varchar,@deleted_isn)
begin TRAN
EXEC(@execstr_del)
commit TRAN
--PRINT CHAR(13)+'status 1: '+convert
(varchar,@@FETCH_STATUS)
CLOSE commandes
DEALLOCATE commandes

SET @execstr_del='delete from pemontag_tvx3 where
pemontag_isn='+convert(varchar,@deleted_isn)
--PRINT CHAR(13)+@execstr_del

EXEC(@execstr_del)
--PRINT CHAR(13)+'status 2: '+convert
(varchar,@@FETCH_STATUS)

commit

RETURN @deleted_isn
GO



Avatar
Fred BROUARD
Beaucoup d'horreur dans ce code :
1) pas besoin d'utiliser un curseur
2) clause top sans order by
3) gestion de transaction plus que hasardeuse

Et a mon avis pas besoin d'exécuter cela 11 millions de fois en imbriauant les requêtes... Que veut tu faire exactement ???

voici le code corrigé :

CREATE PROCEDURE usp_clean_pemontag
AS

DECLARE @deleted_isn numeric(10)

BEGIN TRANSACTION

SELECT TOP 1 @deleted_isn = pemontag_isn
FROM pemontag_tvx3
ORDER BY 1
IF @@ERROR <> 0
GOTO LBL_ERROR

DELETE FROM pemontag
WHERE pemontag_isn = @deleted_isn
IF @@ERROR <> 0
GOTO LBL_ERROR

DELETE FROM pemontag_tvx3
WHERE pemontag_isn = @deleted_isn
IF @@ERROR <> 0
GOTO LBL_ERROR

SELECT @deleted_isn

COMMIT TRANSACTION

RETURN

LBL_ERROR:

ROLLBACK TRANSACTION

GO

A +


PS : il me parait nécessaire que tu te forme à Transact SQL...
Pour débuter : http://sqlpro.developpez.com/TransactSQL/SQL_MSTransactSQL.html

--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************


a écrit:
Merci Jacques... C'est vrai que c'est paradoxal de devoir
executer une commande 11 millions de fois...

Faudrait-il executer ma requête avec un cursor ?

voici ma requete:

CREATE PROCEDURE usp_clean_pemontag AS
DECLARE @execstr_del varchar(100),@deleted_isn numeric(10)

DECLARE commandes CURSOR FOR
select top 1 pemontag_isn
from pemontag_tvx3
OPEN commandes

FETCH commandes INTO @deleted_isn

SET @execstr_del='delete from pemontag where
pemontag_isn='+convert(varchar,@deleted_isn)
begin TRAN
EXEC(@execstr_del)
commit TRAN
--PRINT CHAR(13)+'status 1: '+convert
(varchar,@@FETCH_STATUS)
CLOSE commandes
DEALLOCATE commandes

SET @execstr_del='delete from pemontag_tvx3 where
pemontag_isn='+convert(varchar,@deleted_isn)
--PRINT CHAR(13)+@execstr_del

EXEC(@execstr_del)
--PRINT CHAR(13)+'status 2: '+convert
(varchar,@@FETCH_STATUS)

commit

RETURN @deleted_isn
GO



Avatar
Merci beaucoup Fred pour ton travail! C'est vraiment
nickel!!!

Le but de cette requête est de supprimer des
enregistrement dans la table "pemontag" et il y en a un
peu près 11 millions à supprimer....

Merci encore pour ton aide très précieuse...!!!

salutation,
Daniel
Avatar
Fred BROUARD
a mon avis une seule exécution est suffisante.

Mais si tu veut le faire par lot, alors passe la largeur du lot en paramètre :

CREATE PROCEDURE usp_clean_pemontag @maxLignes int
AS

DECLARE @SQL VARCHAR(8000)

BEGIN TRANSACTION

SET @SQL = 'DELETE FROM pemontag ' +
'WHERE pemontag_isn IN ( SELECT TOP ' + CAST(@maxLignes AS VARCHAR(16)) + ' pemontag_isn ' +
'FROM pemontag_tvx3 ' +
'ORDER BY 1 ' ) '
EXEC (@SQL)
IF @@ERROR <> 0
GOTO LBL_ERROR

SET @SQL = 'DELETE FROM pemontag_tvx3 ' +
'WHERE pemontag_isn IN ( SELECT TOP ' + CAST(@maxLignes AS VARCHAR(16)) + ' pemontag_isn ' +
'FROM pemontag_tvx3 ' +
'ORDER BY 1 ' ) '
EXEC (@SQL)
IF @@ERROR <> 0
GOTO LBL_ERROR

COMMIT TRANSACTION

PRINT CAST(@maxLignes AS VARCHAR(16))+' lignes ont été supprimées...'

RETURN

LBL_ERROR:

ROLLBACK TRANSACTION

GO

Exemple d'exécution :

usp_clean_pemontag 1000


Supprime d'un seul coup 1000 lignes....

A +



a écrit:
Merci beaucoup Fred pour ton travail! C'est vraiment
nickel!!!

Le but de cette requête est de supprimer des
enregistrement dans la table "pemontag" et il y en a un
peu près 11 millions à supprimer....

Merci encore pour ton aide très précieuse...!!!

salutation,
Daniel



--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************