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

MS SQL Server Discussion :

Problème Curseur SQL SERVER


Sujet :

MS SQL Server

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 150
    Points : 65
    Points
    65
    Par défaut Problème Curseur SQL SERVER
    Bonjour,
    J'ai fait un trigger qui controle la mise à jour de la colonne d'une ligne. Si cette mise à jour est effectué alors j'effectue une mise à jour sur d'autres lignes. Seulement quand je change la valeur sur lequel est attribué le trigger alors SQL me dit que un curseur est déjà ouvert.
    Voila mon trigger:
    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
     
    CREATE TRIGGER PassageBF ON [dbo].[F_DOCLIGNE] 
    FOR  UPDATE
    AS
    DECLARE @PasseBF NUMERIC(13), @Qte NUMERIC(13),@Type SMALLINT,@Piece VARCHAR(9),@DL_No INTEGER,@QteAvant NUMERIC(13),@Test INTEGER
     
    SELECT @Type=DO_Type,@PasseBF=PassageBF,@Qte=DL_Qte,@Piece=DO_Piece,@DL_No=DL_No FROM Inserted
    SELECT @QteAvant=DL_Qte FROM Deleted
    Set @Test=0
    IF @Type=25
    BEGIN
    	WHILE @Test=0
    	BEGIN
    		DECLARE curseurOF CURSOR 
    		FOR SELECT DL_Qte FROM F_DOCLIGNE WHERE DL_No<>@DL_No AND DO_Piece=@Piece
     
    		Open curseurOF
     
    		FETCH NEXT FROM curseurOF
      				WHILE @@FETCH_STATUS = 0
      				BEGIN
    					Set @Test=1
    					UPDATE F_DOCLIGNE SET DL_Qte=(DL_Qte*@Qte)/@QteAvant FROM F_DOCLIGNE WHERE DL_No<>@DL_No AND DO_Piece = @Piece
      					COMMIT
    					FETCH NEXT FROM CurseurOF;
      				END
    		CLOSE curseurOF 
    		DEALLOCATE curseurOF
    	END
     
     
    END
    Merci

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 150
    Points : 65
    Points
    65
    Par défaut
    En faite je me suis rendu compte que ceci venait de mon UPDATE mais j'ai toujours la même erreur.

  3. #3
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 222
    Points : 19 551
    Points
    19 551
    Billets dans le blog
    25
    Par défaut
    Pourquoi un curseur dans le trigger ?
    Pourquio ne traitez-vous pas votre set en ensembliste ?
    Sr DBA Oracle / MS-SQL / MySQL / Postgresql / SAP-Sybase / Informix / DB2

    N'oublie pas de consulter mes articles, mon blog, les cours et les FAQ SGBD

    Attention : pas de réponse technique par MP : pensez aux autres, passez par les forums !

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 150
    Points : 65
    Points
    65
    Par défaut
    Explique plus

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    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 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    1) vous pouvez utiliser IF UPDATE(DO_Type) pour limiter le trigger si aucune modif n'est intervenue sur cette colonne

    2) un UPDATE dans un curseur portant sur les données de la table sous jacente au curseur doit se faire en utilisant un filtre WHERE CURRENT OF
    <nom_curseur>. Sans cela vous desynchroniserez le jeu de données du curseur.

    3) utiliser un curseur est toujours peu perfromant. Utiliser un trigger est très couteux. L'association trigger + curseur, est exécrable en terme de performances. Ajoutons à cela une vrai fausse boucle WHILE et on obtient des temps de réponse catastrophique. Évidemment le tout ne sera visible que lors de la montée en charge lorsque l'appli sera livrée et en exploit !...

    Utilisez une logique ensembliste du genre (c'est à dire une requête) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE TRIGGER PassageBF ON [dbo].[F_DOCLIGNE]
    FOR  UPDATE
    AS
     
    UPDATE F_DOCLIGNE 
    SET    DL_Qte = DL_Qte * DL_Qte ) / i.DL_Qtet 
    FROM   F_DOCLIGNE L
           INNER JOIN inserted i ON ??? --(clef de L = clef de i)
           INNER JOIN deleted  d ON ??? --(clef de L = clef de d)
    WHERE  L.DO_Type = 25
    AND    L.DL_No <> i.DL_No
    Si vous voulez une formation SQL Server, je fais du cours standard comme à la carte !

    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/ * * * * *

Discussions similaires

  1. [2008R2] Problème curseur sql server 2008 r2
    Par kent69003 dans le forum Développement
    Réponses: 2
    Dernier message: 29/04/2015, 09h46
  2. Problème installation SQL server express
    Par Guennec.Yannick dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 22/03/2006, 19h26
  3. Problème avec les curseurs SQL SERVER
    Par stefostillrise dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 11/11/2005, 13h09
  4. Problème installation SQL Server 2000 (programme antérieur)
    Par 404Found dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 25/04/2005, 10h24
  5. Problème réplication SQL Server et SQL Server CE (RDA)
    Par didix11 dans le forum Réplications
    Réponses: 2
    Dernier message: 15/04/2004, 11h10

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