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 :

Problème sur CURSOR UPDATE (à appliquer sur 1 colonne et sur toutes les lignes d'une table)


Sujet :

Développement SQL Server

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 51
    Par défaut Problème sur CURSOR UPDATE (à appliquer sur 1 colonne et sur toutes les lignes d'une table)
    Bonjour à tous,
    Je galère depuis un moment sur un curseur d'update SQL SERVER 2012 et je sollicite votre aide tant mon client s'impatiente .
    Dans une table je dois mettre à jour une colonne à partir d'une valeur issue d'une procédure stockée appelée [TTACalculationView].
    Je passe en paramètre à cette fonction deux valeurs une date de début et une date de fin et me retourne en résultat une durée @ResultDuree.
    Les autres valeurs PBAxxxxx sont ma clé primaire multiple.

    Le code ci -dessous provoque une boucle infinie :
    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
    USE [SANDBOX]
    GO
    /****** Object:  StoredProcedure [UpdateColumnCalculLeadTime]    Script Date: 07/02/2019 09:25:54 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author:		<Author,,Name>
    -- Create date: <Create Date,,>
    -- Description:	<Description,,>
    -- =============================================
    ALTER PROCEDURE [UpdateColumnCalculLeadTime]
    	-- Add the parameters for the stored procedure here
    AS
    BEGIN
    	-- SET NOCOUNT ON added to prevent extra result sets from interfering with SELECT statements.
           SET NOCOUNT ON;
     
           -- Define variables
           DECLARE @DateDebut [datetime2](0), 
                   @DateFin [datetime2](0),
                   @ResultDuree float,
    			   @PBA_TASKHIST_NotificationNumber_ bigint, -- Clés primaires @PBA_TASKHIST_NotificationNumber_ + @PBA_TASKHIST_TaskCode_ + @PBA_TASKHIST_SeqTaskNumber_
    			   @PBA_TASKHIST_TaskCode_ varchar(4), 
    			   @PBA_TASKHIST_SeqTaskNumber_ smallint
     
         DECLARE DATE_CURSOR CURSOR 
           --LOCAL STATIC READ_ONLY FORWARD_ONLY
           FOR 
           SELECT [PBA_TASKHIST_NotificationNumber], [PBA_TASKHIST_TaskCode], [PBA_TASKHIST_SeqTaskNumber], [PBA_TASKHIST_BeginningDate], [O_DQN_CREATED_DATE], [calcDurationTask] FROM [TTACalculationView] FOR UPDATE OF  [calcDurationTask] 
     
           OPEN DATE_CURSOR
           FETCH NEXT FROM DATE_CURSOR INTO @PBA_TASKHIST_NotificationNumber_, @PBA_TASKHIST_TaskCode_, @PBA_TASKHIST_SeqTaskNumber_, @DateDebut, @DateFin, @ResultDuree
     
    	   WHILE @@FETCH_STATUS = 0
    	       BEGIN 
    		   EXEC [EssaiCreation] @DateDebut, @DateFin, @ResultDuree OUTPUT
     
    		   UPDATE [TTACalculationView] SET [calcDurationTask] = @ResultDuree WHERE CURRENT OF DATE_CURSOR
    		   --WHERE [PBA_TASKHIST_NotificationNumber]=@PBA_TASKHIST_NotificationNumber_ AND [PBA_TASKHIST_TaskCode]=@PBA_TASKHIST_TaskCode_ AND [PBA_TASKHIST_SeqTaskNumber]=@PBA_TASKHIST_SeqTaskNumber_
     
    		   -- Next table 
    		   FETCH NEXT FROM DATE_CURSOR INTO @PBA_TASKHIST_NotificationNumber_, @PBA_TASKHIST_TaskCode_, @PBA_TASKHIST_SeqTaskNumber_, @DateDebut, @DateFin, @ResultDuree
    		   --FETCH NEXT FROM DATE_CURSOR INTO [TTACalculationView]
           END
     
           CLOSE DATE_CURSOR
           DEALLOCATE DATE_CURSOR
     
    END

  2. #2
    Membre éclairé
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2015
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 60
    Par défaut
    Bonjour,

    Niveau performances, les curseurs ce n'est pas le TOP...

    visiblement, dans ton cas, un bête UPDATE suffirait :

    - transformer la procédure EssaiCreation en fonction qui renvoie la durée
    - utiliser la fonction dans la requete UPDATE.

    du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    UPDATE [TTACalculationView] SET [calcDurationTask] = dbo.[EssaiCreation] (DateDebut, DateFin)
    a+
    Seb

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 51
    Par défaut
    Bonjour Sébastien,
    Merci pour ton retour. C'est vrai qu'une seule requête toute simple fait rêver. J'ai vu aussi qu'en terme de perf ce n'est pas la joie.
    Tu as bien compris le besoin, le problème est : "comment fais-tu pour passer @DateDebut et @DateFin à ta fonction pour chaque ligne de ta table?". D'ou le CURSOR ou alors quelque chose m'échappe.
    L'idée est d'aussi d'avoir une solution qui fonctionne au plus vite, par l'une ou l'autre des solutions. J'aimerais aussi la soluce par la question d'origine car aujourd'hui cela ne fonctionne pas. Je me lance en // sur les 2 scénarios.

  4. #4
    Membre éclairé
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2015
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 60
    Par défaut
    je viens de modifier ma réponse précédente :
    les paramètres à passer à la fonction, ce sont les colonnes DateDebut et DateFin de la ligne qui subit l'UPDATE.

    copier/coller sans relire...

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 51
    Par défaut
    Oui je comprends bien pour une ligne mais pour toutes les lignes de ta table? Comment fais-tu pour passer à chaque ligne de ta table deux paramètres différents?
    Je transforme actuellement ma procédure stockée en fonction.

  6. #6
    Membre éclairé
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2015
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 60
    Par défaut
    C'est SQL qui s'en débrouille tout seul comme un grand !

    C'est comme quand tu fais SELECT LEFT(CodeArticle, 2) FROM ARTICLE :
    SQL comprend bien que tu utilise la fonction LEFT avec en paramètre la valeur de la colonne CodeArticle de la table ARTICLE de la requete.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 51
    Par défaut
    Merci à toi cela fonctionne. Je n'effectuerai donc pas de création de CURSOR. Encore Merci.
    Peux-tu stp, par confidentialité, supprimer les schémas dans le copier/coller des requêtes stp, c'est ma faute.

  8. #8
    Membre éclairé
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2015
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 60
    Par défaut
    je viens de le faire pour mes messages.
    Je ne peux pas le faire pour les tiens.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/07/2017, 18h02
  2. [XL-2003] Modifier le le format Date sur toute les lignes d'une colonne
    Par Djohn dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 30/08/2010, 14h00
  3. Réponses: 8
    Dernier message: 05/04/2010, 10h14
  4. Réponses: 3
    Dernier message: 28/04/2009, 00h42

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