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 :

pb sur appel distant d'une procédure stockée


Sujet :

MS SQL Server

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 97
    Par défaut pb sur appel distant d'une procédure stockée
    Bonjour,

    Je travaille actuellement sur un site ASP qui sollicite une procédure stockée sur le serveur SQL pour me donner un jeu d'enregistrements. Curieusement, je viens de constater que les résultats restitués en local (via MS SQL Management Studio) ne correspondent pas à ceux que je récupère via ma page ASP. Au final, les résultats distants sont moins nombreux que ceux je dois récupérer !!.

    Côté serveur : windows server 2008 R2 + SQL serverExpress + ODBC
    Côté client : page en asp avec ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    set objCD=Server.CreateObject("ADODB.command")
    set objCD.activeconnection=conn
    objCD.CommandType = 4
    objCD.commandtext="p2_factures_lignes"
    objCD.parameters.append objCD.createparameter("@datefac",135,1,,now())
    Set lf=objCD.execute
    Un début de piste ?

    Merci d'avance.

  2. #2
    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,

    C'est très certainement la date qui est mal passée.

    Quel est le type du paramètre @datefac ?

    Au besoin, mettez une trace (avec le profiler par exemple) pour voir la commande réellement exécutée au niveau du serveur

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 97
    Par défaut
    en fait, la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    objCD.parameters.append objCD.createparameter("@datefac",135,1,,now())
    doit être renseignée ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    objCD.parameters.append objCD.createparameter("@datefac",135,1,,"2013-12-31")
    Le now() est donc mal interprété. En pratique, la première version fonctionnait pour la partie de la procédure stockée qui ne décomposait pas la date, comme dans le critère

    en revanche, elle ne fonctionne pas quand il faut décomposer, comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cc.annee<=year(@datefac) and cc.mois<month(@datefac)
    A bon entendeur,

  4. #4
    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
    Citation Envoyé par oxedet Voir le message
    en revanche, elle ne fonctionne pas quand il faut décomposer, comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cc.annee<=year(@datefac) and cc.mois<month(@datefac)
    C'est normal, on est passé au mois de janvier !

    Je suppose que vous voulez les factures (?) qui datent d'avant le mois de la date passé en paramètre. Donc dans votre exemple, toutes les factures de novembre 2013, ou précédentes. Est-ce bien ça ?

    Sauf que dans votre code, vous cherchez les factures dont l'année est antérieure ou égale à l'année de la date : OK ! mais votre deuxième condition pose problème : vous cherchez les factures dont le mois est antérieur au mois de la date spécifiée. Pour une date sur décembre, vous allez récupérer novembre, octobre, ... Mais pour janvier, vous ne récupérer rien, car aucune date n'a le mois inférieur à 1 !

    Faites plutôt comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    WHERE cc.annee < year(@datefac)
    OR
    cc.annee=year(@datefac) AND cc.mois<month(@datefac)

    Mais pourquoi stocker la date sur deux colonnes ?

    Si vous aviez une colonne de type date, vous pourriez faire ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    WHERE LaDate < 		DATEADD(
    			MONTH
    			,
    			DATEDIFF(
    				MONTH
    				,0
    				,@datefac
    			)
    			,0
    		)

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 97
    Par défaut
    Tout ça est bien vu merci !

    Pour être plus précis, :
    - Cette procédure compose les lignes de factures à produire à la date désignée (datefac)
    - Elle agrège une série de requêtes (4) en UNION,
    - 3 d'entre elles comportent des dates sur lesquelles peut s'appliquer le filtre @datefac
    - la quatrième n'a pas de date (il s'agit de loyers mensuels dont seul l'existence est stockée). Voici la portion correspondante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT c.ID_ENTITE, cc.ID_COLLECTE, cc.ID_CONTRAT, d.ID_DISPOSITION,d.id_unite, 
           cc.QUANTITE AS quantite,
            ISNULL(dp.PRIX, 0) AS Prix_Unitaire, 
            0 AS quantitePD
    FROM    dbo.collecte_contrat AS cc WITH (nolock) INNER JOIN
            dbo.DISPO AS d WITH (nolock) ON cc.ID_DISPOSITION = d.ID_DISPOSITION INNER JOIN
            dbo.contrat AS c WITH (nolock) ON cc.ID_CONTRAT = c.ID_CONTRAT INNER JOIN
            dbo.DISPOSITIONPARTICULIERE AS dp WITH (nolock) ON cc.ID_CONTRAT = dp.ID_CONTRAT AND d.ID_DISPOSITION = dp.ID_DISPOSITION
    WHERE   ((d.ID_UNITE = 'ME') OR (d.ID_UNITE = 'LO')) and c.CONTRAT_ACTIF=1  and cc.quantite>0
    and (cc.annee is null or cc.annee='' or (cc.annee<=year(@datefac) and cc.mois<month(@datefac)))
    Votre remarque est donc totalement judicieuse. Sauf que je ne peux pas faire autrement. Pour savoir si j'ai facturé cette ligne pour le mois donné, je stocke annee+mois de dernière facturation dans des colonnes ad-hoc. Bon en écrivant, je me dis que pourrais y mettre la dernière date de facturation... je vais regarder.

    Je peux jouer en concision avec une concaténation, genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    concat(cc.annee,cc.mois)<concat(year(@datefac),month(@datefac))
    sauf que month doit renvoyer 1 et non 01...

  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
    Citation Envoyé par oxedet Voir le message
    Je peux jouer en concision avec une concaténation, genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    concat(cc.annee,cc.mois)<concat(year(@datefac),month(@datefac))
    sauf que month doit renvoyer 1 et non 01...
    Oui, et surtout, avec un telle solution, la requête ne pourra pas profiter d'un index sur les dates

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 97
    Par défaut
    en effet mais de toute façon j'ai tout de même des soucis avec cette procédure stockée (je n'en suis pas le concepteur initial, seulement le repreneur), c'est que j'ai régulièrement des plantages dans son exécution : dealock avec message du genre
    "...a été bloquée sur les ressources verrou par un autre processus et a été choisie comme victime".

    Remplacer les mentions "NO LOCK" pas des "TABLOCKX" aurait-il un intérêt ?

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

Discussions similaires

  1. [2012] Appeler une procédure stockée sur un jeu de résultats
    Par waxman2 dans le forum Développement
    Réponses: 9
    Dernier message: 22/08/2013, 19h27
  2. Boucle sur UNION en utilisant une procédure stockée
    Par laloune dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 06/05/2011, 10h32
  3. Curseur sur l'EXEC d'une procédure stockée (ASE)
    Par bombseb dans le forum Adaptive Server Enterprise
    Réponses: 2
    Dernier message: 17/03/2010, 15h17
  4. Réponses: 2
    Dernier message: 11/01/2008, 17h05
  5. SELECT sur le résultat d'une procédure stockée
    Par sorcer1 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 28/09/2007, 13h28

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