IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Optimiser une procédure utilisant un curseur


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2010
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 3
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 999
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 999
    Billets dans le blog
    6
    Par défaut
    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
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Futur Membre du Club
    Inscrit en
    Décembre 2010
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 3
    Par défaut
    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

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 999
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 999
    Billets dans le blog
    6
    Par défaut
    Il suffit d'apprendre le langage SQL !!!

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Futur Membre du Club
    Inscrit en
    Décembre 2010
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 3
    Par défaut
    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 :

    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.

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    bonjour

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

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    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)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. optimiser une procédure stockée
    Par ed222 dans le forum Développement
    Réponses: 8
    Dernier message: 15/06/2010, 17h30
  2. Réponses: 2
    Dernier message: 12/06/2009, 17h56
  3. Optimisation Procédure stocké utilisant 2 curseurs
    Par m-mas dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 23/02/2007, 09h27
  4. [SQL2005] Optimiser une procédure stockée
    Par david_chardonnet dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 20/12/2006, 15h48
  5. Réponses: 5
    Dernier message: 09/05/2005, 12h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo