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/2010, 11h47   #1
Invité de passage
 
Inscription : décembre 2010
Messages : 3
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 3
Points : 1
Points : 1
Par défaut Optimiser une procédure utilisant un curseur

Bonjour,

je cherche à optimiser le code suivant (le temps d'exécution est relativement long par rapport à la taille de la base).

J'utilise SQL Server 2000

Merci pour votre aide.

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
 
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[Cloture]
 
	-- Add the parameters for the stored procedure here
	@iRDS int ,
	@iRDev int 
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;
 
END
DECLARE		
		@iRF int,
		@iRC int,
		@iRD int,
		@dPM decimal(15,3),
		@dDPA decimal(15,3),
		@dDPV decimal(15,3),
		@dQ decimal(15,3),
		@dDP datetime,
		@sDS varchar(19),
		@dDS datetime,
		@dCE decimal(11,3),
		@dCS decimal(11,3)
 
SELECT @dDS = isnull(Date,'01/01/1900') FROM DS WHERE Ref = @iRDS
SET @sDS = convert(varchar,@dDS,3)+' '+convert(varchar,@dDS,108)
 
-- Cas des Prs Cnds sans dépot affecté
 
DECLARE CPCursor CURSOR FOR
SELECT Pr,Cnd FROM CndPr
 
OPEN CPCursor
FETCH NEXT FROM CPCursor INTO @iRF, @iRC
 
WHILE @@FETCH_STATUS=0
 
	BEGIN
 
		SET @dPM  = 0
		SET @dDPA  = 0
		SET @dDPV = 0
		SET @dQ  = 0
		SET @dCE =0
		SET @dCS =0
 
		SELECT @dPM = ISNULL(PMP,0),@dDPA =isnull(DPA,0), @dQ = isnull(Qté,0), @dCE = QtéEntrée, @dCS= QtéSortie,@dDP = datepièce,@dDPV = Vente
		FROM [dbo].fn_StockPr(@iRF,@iRC,@sDS,'ST',@iRDev,NULL,0)
		INSERT INTO Stock (DS,Pr,Cnd,Dep,Devs,PMP,DPA,Qté,DM,CE,CS,PMPC,PMPA,DPV)
		VALUES (@iRDS, @iRF,@iRC,@iRD,@iRDev,@dPM,@dDPA, @dQ, @dDP, @dCE, @dCS,NULL,@dPM,@dDPV)
 
		FETCH NEXT FROM CPCursor INTO @iRF, @iRC
 
	END
 
CLOSE CPCursor
DEALLOCATE CPCursor
 
-- Cas des Prs Cnd avec un dépot affecté
DECLARE CPDCursor CURSOR FOR
SELECT CP.Pr,CP.Cnd, D.Ref FROM CndPr AS CP
CROSS JOIN Dep AS D
 
 
OPEN CPDCursor
FETCH NEXT FROM CPDCursor INTO @iRF, @iRC, @iRD
 
WHILE @@FETCH_STATUS=0
 
	BEGIN
 
		SET @dPM  = 0
		SET @dDPA  = 0
		SET @dQ  = 0
		SET @dCE =0
		SET @dCS =0
 
 
		SELECT @dPM = ISNULL(PMP,0),@dDPA =isnull(DPA,0), @dQ = isnull(Qté,0), @dCE = QtéEntrée, @dCS= QtéSortie,@dDP = datepièce
		FROM [dbo].fn_StockPr(@iRF,@iRC,@sDS,'STOCK',@iRDev,@iRD,0)
 
		INSERT INTO Stock (DS,Pr,Cnd,Dep,Devs,PMP,DPA,Qté,DM,CE,CS,PMPC,PMPA,DPV)
		VALUES (@iRDS, @iRF,@iRC,@iRD,@iRDev,@dPM,@dDPA, @dQ, @dDP, @dCE, @dCS,NULL,@dPM,NULL)
 
		FETCH NEXT FROM CPDCursor INTO @iRF, @iRC, @iRD
 
	END
 
CLOSE CPDCursor
DEALLOCATE CPDCursor
 
RETURN
TizDei est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 13h55   #2
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 937
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 937
Points : 17 745
Points : 17 745
Vous pouvez remplacer tout ceci par une seule requête INSERT....

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 02/12/2010, 17h22   #3
Invité de passage
 
Inscription : décembre 2010
Messages : 3
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 3
Points : 1
Points : 1
Merci Frédéric,

je fais du SQL seulement depuis 1 mois et j'ai cherché avec cette indication mais je n'y arrive pas.
J'ai besoin de plus d'info.
Merci d'avance.

Alain
TizDei est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 17h38   #4
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 937
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 937
Points : 17 745
Points : 17 745
Il suffit d'apprendre le langage SQL !!!

Voici un début de solution à votre problème :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
ALTER PROCEDURE [dbo].[Cloture]
 
	-- Add the parameters for the stored procedure here
	@iRDS int ,
	@iRDev int 
AS
 
   INSERT INTO Stock (DS,Pr,Cnd,Dep,Devs,PMP,DPA,Qté,DM,CE,CS,PMPC,PMPA,DPV)
   SELECT @iRDS, Pr, Cnd, NULL, @iRDev, 0, isnull(DPA,0), isnull(Qté,0), datepièce, QtéEntrée, QtéSortie, NULL, ISNULL(PMP,0), Vente
   FROM   CndPr
          CROSS JOIN DS WHERE Ref = @iRDS
          CROSS APPLY [dbo].fn_StockPr(pr,cnd, isnull(Date,'01/01/1900'),'ST', @iRDev,NULL,0)
Sans garantie, car vous n'avez pas respecté la charte de postage !
http://www.developpez.net/forums/d96...vement-poster/

A vous de faire la seconde insertion, qui, comme elle est pour la même table, peut sans doute être mutualisée avec la première à l'aide d'un CASE !

SQL est un langage... cela s'apprend ! Mon site web, comme mon bouquin, peuvent vous y aider....

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2010, 12h13   #5
Invité de passage
 
Inscription : décembre 2010
Messages : 3
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 3
Points : 1
Points : 1
Merci Frédéric,

le CROSS APPLY est une solution que j'avais déjà envisagé.

Par contre quand je lance la requête je reçois le message d'erreur suivant :

Citation:
Msg 156, Niveau 15, État 1, Procédure Cloture, Ligne 12
Syntaxe incorrecte vers le mot clé 'CROSS'.
Note : Actuellement j'utilise SQL Server 2008 mais la base doit être installée sur SQL Server 2000.
TizDei est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2010, 12h21   #6
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
bonjour

il me semble que le problème vienne du WHERE dans le CROSS JOIN, qui devrait être un ON :

Code sql :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
ALTER PROCEDURE [dbo].[Cloture]
 
	-- Add the parameters for the stored procedure here
	@iRDS int ,
	@iRDev int 
AS
 
   INSERT INTO Stock (DS,Pr,Cnd,Dep,Devs,PMP,DPA,Qté,DM,CE,CS,PMPC,PMPA,DPV)
   SELECT @iRDS, Pr, Cnd, NULL, @iRDev, 0, isnull(DPA,0), isnull(Qté,0), datepièce, QtéEntrée, QtéSortie, NULL, ISNULL(PMP,0), Vente
   FROM   CndPr
          CROSS JOIN DS ON Ref = @iRDS
          CROSS APPLY [dbo].fn_StockPr(pr,cnd, isnull(Date,'01/01/1900'),'ST', @iRDev,NULL,0)
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2010, 13h48   #7
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 937
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 937
Points : 17 745
Points : 17 745
oui !

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro 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 11h27.


 
 
 
 
Partenaires

Hébergement Web