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 :

[2005]Procédure stockée marche dans SQL Manager mais pas lorsqu'un logiciel l'appelle


Sujet :

MS SQL Server

  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 085
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 085
    Points : 886
    Points
    886
    Par défaut [2005]Procédure stockée marche dans SQL Manager mais pas lorsqu'un logiciel l'appelle
    Bonjour à tous,
    Voilà j'ai une procédure stockée qui, lorsque je l'exécute dans SQL Manager, fonctionne très bien et très rapide (1 sec à tout cassé).

    J'essaie d'exécuter cette procédure stockée à partir d'un programme et là, il me renvoie un message d'erreur "Délai d'attente dépassé...". Ce délai est fixé à 30 sec dans les propriété de ma connexion.

    D'où pourrait venir ce problème ?

    PS : Toutes les autres procédures fonctionnent parfaitement à l'appel du programme.

    Voici le code de la procédure stockée (Désolé pour la mise en page du code --> problème de la balise CODE

    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
    SELECT M.MVT_JNL, J.JNL_INT, J.JNL_CPT, M.MVT_GEN, G.GEN_INT,H.CUMUL_DB, H.CUMUL_CR, 
    ABS(SUM(CASE 
    WHEN MVT_MNT < 0
    THEN MVT_MNT
    ELSE 0
    END))As SLD_DB, 
    SUM(CASE 
    WHEN MVT_MNT > 0
    THEN MVT_MNT
    ELSE 0
    END)As SLD_CR 
    FROM(((D_MVT AS M 
    INNER JOIN D_GEN AS G ON G.GEN_NUM=M.MVT_GEN) 
    INNER JOIN D_JNL AS J ON J.JNL_NUM=M.MVT_JNL) 
    LEFT JOIN(SELECT MVT_JNL, 
    ABS(SUM(CASE WHEN MVT_MNT < 0 THEN MVT_MNT ELSE 0 END))As CUMUL_DB, 
    SUM(CASE WHEN MVT_MNT > 0 THEN MVT_MNT ELSE 0 END)As CUMUL_CR
    FROM D_MVT
    WHERE(MVT_DATE <= @Date)AND(MVT_PER = @Per) 
    GROUP BY MVT_JNL)As H ON H.MVT_JNL = M.MVT_JNL) 
    WHERE(MVT_DATE <= @Date)AND(MVT_PER = @Per) 
    GROUP BY M.MVT_JNL, J.JNL_INT, J.JNL_CPT, M.MVT_GEN, G.GEN_INT, H.CUMUL_DB, H.CUMUL_CR
    HAVING 
    (ABS(SUM(CASE 
    WHEN MVT_MNT < 0
    THEN MVT_MNT
    ELSE 0
    END))<> 0)OR
    (SUM(CASE 
    WHEN MVT_MNT > 0
    THEN MVT_MNT
    ELSE 0
    END)<> 0) 
    ORDER BY M.MVT_JNL, M.MVT_GEN;
    
    Merci

  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 849
    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 849
    Points : 52 978
    Points
    52 978
    Billets dans le blog
    6
    Par défaut
    enlevez le point virgule final.
    les parenthèses imbriquées ne servent à rien
    aérez votre code en ajoutant des espaces

    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
    SELECT M.MVT_JNL, J.JNL_INT, J.JNL_CPT, M.MVT_GEN, G.GEN_INT, H.CUMUL_DB, H.CUMUL_CR, 
           ABS(SUM(CASE 
                      WHEN MVT_MNT < 0
                         THEN MVT_MNT
                      ELSE 0
                   END))As SLD_DB, 
           SUM(CASE 
                  WHEN MVT_MNT > 0
                     THEN MVT_MNT
                  ELSE 0
               END)As SLD_CR 
    FROM  D_MVT AS M 
          INNER JOIN D_GEN AS G 
                ON G.GEN_NUM = M.MVT_GEN 
          INNER JOIN D_JNL AS J 
                ON J.JNL_NUM = M.MVT_JNL 
          LEFT OUTER JOIN (SELECT MVT_JNL, 
                                  ABS(SUM(CASE WHEN MVT_MNT < 0 THEN MVT_MNT ELSE 0 END))As CUMUL_DB, 
                                  SUM(CASE WHEN MVT_MNT > 0 THEN MVT_MNT ELSE 0 END)As CUMUL_CR
                           FROM D_MVT
                           WHERE(MVT_DATE <= @Date) AND (MVT_PER = @Per) 
                           GROUP BY MVT_JNL) As H 
               ON H.MVT_JNL = M.MVT_JNL
    WHERE (MVT_DATE <= @Date) AND (MVT_PER = @Per) 
    GROUP  BY M.MVT_JNL, J.JNL_INT, J.JNL_CPT, M.MVT_GEN, G.GEN_INT, H.CUMUL_DB, H.CUMUL_CR
    HAVING ABS(SUM(CASE 
                      WHEN MVT_MNT < 0
                         THEN MVT_MNT
                      ELSE 0
                   END)) <> 0
           OR SUM(CASE 
                     WHEN MVT_MNT > 0
                        THEN MVT_MNT
                     ELSE 0
                  END) <> 0 
    ORDER BY M.MVT_JNL, M.MVT_GEN
    D'autre part vousavez des variables dans ce code... Or je ne voit pas la procédure stockée... Ou est l'entête de la proc stock ? Comment l'apellez vous dans le code client ???

    A +

  3. #3
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 085
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 085
    Points : 886
    Points
    886
    Par défaut
    Désolé, voici la procédure complète.
    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
    CREATE PROCEDURE [sc_edition].[Journaux_Centralisateurs] 
    @Date datetime,
    @Per smallint
    AS
    BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    
    
    SELECT M.MVT_JNL, J.JNL_INT, J.JNL_CPT, M.MVT_GEN, G.GEN_INT, H.CUMUL_DB, H.CUMUL_CR, ABS(SUM(CASE WHEN MVT_MNT < 0 THEN MVT_MNT ELSE 0 END))AS SLD_DB, SUM(CASE WHEN MVT_MNT > 0 THEN MVT_MNT ELSE 0 END)AS SLD_CR FROM D_MVT AS M INNER JOIN D_GEN AS G ON G.GEN_NUM = M.MVT_GEN INNER JOIN D_JNL AS J ON J.JNL_NUM = M.MVT_JNL LEFT OUTER JOIN (SELECT MVT_JNL, ABS(SUM(CASE WHEN MVT_MNT < 0 THEN MVT_MNT ELSE 0 END))AS CUMUL_DB, SUM(CASE WHEN MVT_MNT > 0 THEN MVT_MNT ELSE 0 END)AS CUMUL_CR FROM D_MVT WHERE(MVT_DATE <= @Date) AND (MVT_PER = @Per) GROUP BY MVT_JNL) AS H ON H.MVT_JNL = M.MVT_JNL WHERE (MVT_DATE <= @Date) AND (MVT_PER = @Per) GROUP BY M.MVT_JNL, J.JNL_INT, J.JNL_CPT, M.MVT_GEN, G.GEN_INT, H.CUMUL_DB, H.CUMUL_CR HAVING ABS(SUM(CASE WHEN MVT_MNT < 0 THEN MVT_MNT ELSE 0 END)) <> 0 OR SUM(CASE WHEN MVT_MNT > 0 THEN MVT_MNT ELSE 0 END) <> 0 ORDER BY M.MVT_JNL, M.MVT_GEN END
    Concernant l'appel, j'utilise ADO avec le driver natif SQL server pour la connexion.

    Dans un ADOQuery
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
          Query.Active := false;
          Query.SQL.Clear;
          Query.SQL.Text := 'sc_edition.Journaux_Centralisateurs :Date, :Per';
          Query.Parameters.ParamByName('Date').Value := Now;
          Query.Parameters.ParamByName('Per').Value  := 7;
          Query.Active := true;
    Merci

    [Edit]
    J'ai audité l'exécution de la requête avec SQL profiler.
    La requête est donc bien appellée mais on dirait qu'elle boucle quelque part ou qu'elle cale. Dans le temps de l'exécution, j'ai bien la même valeur que mon TimeOut de mon AdoQuery. Bizarre bizarre tout ca....
    [/Edit]

  4. #4
    Membre éprouvé
    Avatar de HULK
    Inscrit en
    Juillet 2003
    Messages
    1 276
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 276
    Points : 1 281
    Points
    1 281
    Par défaut
    c'est peut etre ta chaine de connexion dans ton code client qui n'est pas bonne. Il cherche a se connecter mais n'y arrive pas, donc il te sort un timeout

  5. #5
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 085
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 085
    Points : 886
    Points
    886
    Par défaut
    Tout à fait, mais l'audit fait par SQL Profiler me dit bien qu'elle est bien exécutée. Et une mauvaise chaine d'appel me renverrait direct un message d'erreur. J'ai aussi fait un petit test en changeant tout simplement le code de cette procédure stockée et en y mettant à la place un bête "SELECT * FROM Table". Sans changer mes paramètre d'appel client, cela marche parfaitement. Je ne comprends plus rien moi. Quand on travaille en mode client-serveur, le client ne peut pas commètre d'erreur sur l'exécution de la procédure vu qu'elle s'exécute par le serveur.

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 849
    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 849
    Points : 52 978
    Points
    52 978
    Billets dans le blog
    6
    Par défaut
    Si vous utilisez Delphi, ce n'est ABSOLUMENT pas comme cela que l'on lance une proc stock. Une proc stock n'est pas une requête ! C'est une procédure. Il vous faut donc utiliser un objet ADOStoredproc, lui affecter un objet de connexion dans la propriété connection, rechercher le nom de votre proc stock dans la liste Procedurename puis dans votre code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    WITH MyProc
    DO
    BEGIN
       Active := false;
       Parameters.ParamByName('Date').Value := Now;
       Parameters.ParamByName('Per').Value  := 7;
       Active := true;
    END;
    bref, une formation Client / Server Delphi serait peut être la bienvenue...

    par exemple celle-ci :
    http://www.datasapiens.com/prestations/DelphiSQL.pdf

    A +

  7. #7
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 085
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 085
    Points : 886
    Points
    886
    Par défaut
    Prends toi ca dans les dents Portu .
    Je vais tester. Mais ca marche très bien avec un ADOQuery pourtant

  8. #8
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 085
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 085
    Points : 886
    Points
    886
    Par défaut
    Haaa, fort heureusement pour moi, cela ne marche pas non plus avec un TAdoStoredProc. Toujours la même erreur. Pas besoin d'une formation alors .

    Mais merci tout de même pour cette remarque. Je n'ai pas utilisé le TAdoStoredProc dans le seul but que le TAdoQuery était plus simple à gérer au niveau de paramètres (Je le trouve en tout cas). Maintenant, un TAdoStoredProc n'est rien d'autre qu'un TAdoQuery avec des propiétés plus adéquates pour ce genre d'utilisation. Mais bon, je m'en sors très bien avec.

    Donc sur ce, il n'y a toujours pas une bonne explication à ce problème.

  9. #9
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 849
    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 849
    Points : 52 978
    Points
    52 978
    Billets dans le blog
    6
    Par défaut
    Restez en ADOproc pas en Query il y a des différences très sensible notamment au niveau du "prepare" implicite.

    Quel est le type des paramètres , L'avez vous testée en execution directe dans l'explorateur objet ???

    A +

  10. #10
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 085
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 085
    Points : 886
    Points
    886
    Par défaut
    C'est bon j'ai trouvé . Mais je n'ai pas pour autant la solution. Je compte donc sur vous, les experts. En enlevant les deux colonnes suivantes du SELECT (H.CUMUL_DB, H.CUMUL_CR ). Ca marche.
    Maintenant, pourquoi mon programme n'accepte pas ces deux colonnes ? Un problème avec le type de valeur ?

    [Edit]
    Je me rapproche encore un petit peu plus du problème réel.
    Le problème se pose au niveau de ma jointure LEFT de H.
    Si je mets INNER JOIN , pas de problème.

    Pourtant avec LEFT, dans SQL Manager, il n'y a aucun problème d'exécution

    [/Edit]

  11. #11
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 085
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 085
    Points : 886
    Points
    886
    Par défaut
    Bon j'ai règlé le problème en changeant le code de la procédure et ca marche. Donc, vu que ce problème est très rare, je ne vais pas chercher à comprendre.

    Merci à vous tous.

  12. #12
    Expert éminent
    Homme Profil pro
    Big Data / Freelance EURL
    Inscrit en
    Mars 2003
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Points : 7 291
    Points
    7 291
    Par défaut
    Citation Envoyé par SQLpro
    bref, une formation Client / Server Delphi serait peut être la bienvenue...
    Tu n'y penses pas ! Dans la plupart des ssii c'est un gros mot qui vaut de se faire jeter dans les roses: sauf exception il faut apprendre chez soi à l'arrache ou encore mieux chez le client

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

Discussions similaires

  1. [Débutant] Response.Redirect marche dans un code mais pas ailleurs
    Par kryptong dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 21/03/2013, 10h09
  2. Réponses: 13
    Dernier message: 11/03/2010, 11h29
  3. Base IB marche dans l'EDI, mais pas en run time
    Par kimlee dans le forum Bases de données
    Réponses: 5
    Dernier message: 03/03/2010, 15h34
  4. Réponses: 5
    Dernier message: 02/10/2006, 19h24
  5. Réponses: 2
    Dernier message: 25/03/2006, 18h54

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