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 :

[2008R2]Problème procédure stockée


Sujet :

Développement SQL Server

  1. #1
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut [2008R2]Problème procédure stockée
    Hello,

    Je suis confronté à un problème avec une SP qui doit être une grosse connerie mais je ne la vois et j'en perds mon latin !

    Voici le code de la procédure :
    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
     
    CREATE PROCEDURE [S_OPERATIONAL].[UP_CHIEF_SAVE]
        @PEM_ID        INT,
        @CHI_FROM    DATE,
        @CHI_TO        DATE
    AS
    BEGIN
        SET NOCOUNT ON;
     
        IF EXISTS(SELECT 1 FROM S_OPERATIONAL.V_CHIEF_CHI WHERE PEM_ID = @PEM_ID AND CHI_FROM = @CHI_FROM)
        BEGIN
            UPDATE    S_OPERATIONAL.V_CHIEF_CHI
            SET        CHI_FROM    = @CHI_FROM,
                    CHI_TO        = @CHI_TO
            WHERE    PEM_ID        = @PEM_ID
        END
        ELSE
        BEGIN
            INSERT INTO S_OPERATIONAL.V_CHIEF_CHI (PEM_ID, CHI_FROM, CHI_TO)
            VALUES(@PEM_ID, @CHI_FROM, @CHI_TO)
        END
    END
    Rien de bien folichon quoi... Histoire d'essayer d'y voir clair, je la teste en faisant ceci :
    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
    DECLARE @PEM_ID INT = 773
    DECLARE @CHI_FROM DATE = '20140516'
    DECLARE @CHI_TO DATE = '20141231'
     
    IF EXISTS(SELECT 1 FROM S_OPERATIONAL.V_CHIEF_CHI WHERE PEM_ID = @PEM_ID AND CHI_FROM = @CHI_FROM)
    BEGIN
        UPDATE    S_OPERATIONAL.V_CHIEF_CHI
        SET        CHI_FROM    = @CHI_FROM,
                CHI_TO        = @CHI_TO
        WHERE    PEM_ID        = @PEM_ID
        SELECT 'UPDATE'
    END
    ELSE
    BEGIN
        INSERT INTO S_OPERATIONAL.V_CHIEF_CHI (PEM_ID, CHI_FROM, CHI_TO)
        VALUES(@PEM_ID, @CHI_FROM, @CHI_TO)
        SELECT 'INSERT'
    END
    J'ai donc extrait le code (sauf SET NOCOUNT ON;), déclaré des variables pour remplacé les paramètres et ajouté un select histoire de voir dans quelle branche du IF sql server passe.

    Je l'exécute et, dans l'onglet Results de SSMS, j'ai bien UPDATE mais dans l'onglet message, j'ai ceci :
    Msg 2627, Level 14, State 1, Line 7
    Violation of PRIMARY KEY constraint 'PK__T_CHIEF___16EBFA2672E607DB'. Cannot insert duplicate key in object 'S_OPERATIONAL.T_CHIEF_CHI'. The duplicate key value is (773, 2014-05-16).
    The statement has been terminated.

    (1 row(s) affected)
    Pourquoi diable tente-t-il d'insérer une ligne alors qu'il est sensé faire un update ? Il n'y a pas de trigger sur la vue. Il y a un trigger sur la table sous-jacente mais qui n'entre pas en ligne de compte ici (vu qu'il ne fait aucune insertion ^^). Par souci de transparence, voici le code du trigger :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE TRIGGER [S_OPERATIONAL].[TRG_AFTER_UPDATE_CHI] ON [S_OPERATIONAL].[T_CHIEF_CHI] 
    AFTER UPDATE AS 
    BEGIN 
        SET NOCOUNT ON;  
        UPDATE S_OPERATIONAL.T_CHIEF_CHI 
        SET 
                CHI_MODIFIED_ON = GETDATE(), 
                CHI_MODIFIED_BY = SYSTEM_USER 
        FROM 
                S_OPERATIONAL.T_CHIEF_CHI CHI 
                    INNER JOIN INSERTED INS 
                        ON CHI.PEM_ID = INS.PEM_ID 
    END;
    Bref, j'ai beau retourné le problème dans tous les sens, je ne parviens pas à comprendre pourquoi SQL SERVER tente d'insérer une ligne dans la table T_CHIEF_CHI alors qu'il doit clairement faire un update...

    Quelqu'un aurait-il une idée ??

    Merci d'avance !
    Kropernic

  2. #2
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Bon bin j'ai trouvé... Manquait un critère dans la clause where de l'update... J'avais dit que cela devait être une connerie .
    Kropernic

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

Discussions similaires

  1. Problème procédure stockée
    Par toomsbzh dans le forum SQL
    Réponses: 9
    Dernier message: 31/05/2007, 11h55
  2. Problème procédure Stockée + VBS
    Par gothard dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 20/02/2007, 16h39
  3. Réponses: 2
    Dernier message: 20/09/2006, 14h38
  4. problème procédure stockée
    Par hamham dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 19/04/2006, 12h33
  5. Problème procédure stockée + trie
    Par an_merle dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 14/02/2006, 22h58

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