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 avec Agent SQL et procédure stockée


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mai 2011
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 15
    Par défaut Problème avec Agent SQL et procédure stockée
    Bonjour tout le monde,

    Voilà je débute avec SQL Server Management Studio 2008. Tout d'abord, je fais une sorte de reporting 1 fois toutes les 2 semaines pour facturer des clients. Voici la procédure stockée que j'ai crée

    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
    USE Telephonie_Express_Fr
    GO
     
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
     
    CREATE PROCEDURE ExtractFacturePhone 
     
    	@NameClient nvarchar(10) , 
    	@StartDate datetime ,
    	@EndDate datetime
    AS
    BEGIN
     
    	SET NOCOUNT ON;
     
     
    	SELECT	Phone.name AS Phone,
    			AVG(HST_Currents.Original_Value) AS Moyenne,
    			MIN(HST_Currents.Original_Value) AS Minimum,
    			MAX(HST_Currents.Original_Value) AS Maximum 
    	FROM HST_Currents INNER JOIN
    		Phone ON HST_Currents.Phone_ID = Phone.local_Phone_ID
    	WHERE	(HST_Currents.Topic_ID IN (900, 901, 902))
    			AND (Phone.name IN
    					(SELECT Phone_Name
    						FROM Phone
    						WHERE Phone.Phone_NameClient = @NameClient))
    		AND (dbo.udfTicksToDateTime(HST_Currents.Timestamp_ID) > = @StartDate)
    		AND (dbo.udfTicksToDateTime(HST_Currents.Timestamp_ID) < @EndDate)
     
    END
    GO

    Et voilà ce que j'exécute pour chaque client 1 fois toutes les 2 semaines:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    DECLARE @RC int
    DECLARE @NameClient nvarchar(10)
    DECLARE @StartDate datetime
    DECLARE @EndDate datetime
     
    SET @NameClient = 'DUPONT'
    SET @StartDate = CAST('2013-05-06 00:00' AS datetime)
    SET @EndDate = CAST('2013-05-12 00:00' AS datetime)
     
    EXECUTE @RC = [Telephonie_Express_Fr].[dbo].[ExtractFacturePhone] 
       @NameClient
      ,@StartDate
      ,@EndDate
    GO
    J'ai 2 soucis:

    - Avez-vous une solution pour que j'évite à chaque fois d'exécuter la requête pour chaque client en marquant leur nom manuellement (environ 100) et ainsi changer la date pour que cela se fasse sur 1 semaine sans que j'ai à noter à chaque fois la date ?

    - J'aimerai utiliser l'Agent SQL mais je ne vois pas comment je dois faire, je dois copier coller ma requête suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    DECLARE @RC int
    DECLARE @NameClient nvarchar(10)
    DECLARE @StartDate datetime
    DECLARE @EndDate datetime
     
    SET @NameClient = 'DUPONT'
    SET @StartDate = CAST('2013-05-06 00:00' AS datetime)
    SET @EndDate = CAST('2013-05-12 00:00' AS datetime)
     
    EXECUTE @RC = [Telephonie_Express_Fr].[dbo].[ExtractFacturePhone] 
       @NameClient
      ,@StartDate
      ,@EndDate
    GO
    Sur New Jobs>Steps ?

    Je vous remercie 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,

    votre procédure fonctionne ???
    Il me semble qu'il manque un GROUP BY dans la requete...

    Je crois que vous pouvez récupérer toutes vos données pour tous vos clients sur les 7 deniers jours comme 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
     
    	SELECT	
    			Phone.Phone_NameClient,
    			Phone.name AS Phone,
    			AVG(HST_Currents.Original_Value) AS Moyenne,
    			MIN(HST_Currents.Original_Value) AS Minimum,
    			MAX(HST_Currents.Original_Value) AS Maximum 
    	FROM		HST_Currents 
    	INNER JOIN	Phone 
    		ON			HST_Currents.Phone_ID = Phone.local_Phone_ID
    	WHERE	HST_Currents.Topic_ID BETWEEN 900 AND 902
    		AND Phone.Phone_NameClient = @NameClient))
    		AND	dbo.udfTicksToDateTime(HST_Currents.Timestamp_ID) BETWEEN DATEADD(DAY, -7, CURRENT_TIMESTAMP) AND CURRENT_TIMESTAMP
    	GROUP BY 			
    			Phone.Phone_NameClient,
    			Phone.name AS Phone
    deux remarques cependant :
    1/ il s'agit des sept deniers jours glissant, heure comprise, si ce n'est pas ce qui est voulu, il faudra modifier légèrement la requête
    2/ vous devriez créer l’inverse de la fonction dbo.udfTicksToDateTime, éviter d'appeler une fonction sur une colonne dans votre WHERE : la fonction inverse ne serait appelée qu'une fois, et le moteur pour utiliser un éventuel index sur la date, ce qui n'est pas le cas actuellement.

  3. #3
    Membre averti
    Inscrit en
    Mai 2011
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 15
    Par défaut
    Merci aieeeuuuuu d'avoir répondu aussi rapidemment, oui ma procédure fonctionne j'avais mis le "GROUP BY" mais j'avais oublié de le noter sur le code, merci d'avoir fait la remarque.

    Ce code fonctionne a merveille:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND (dbo.udfTicksToDateTime(HST_Currents.Timestamp_ID) BETWEEN DATEADD(DAY, -7, CURRENT_TIMESTAMP) AND CURRENT_TIMESTAMP)
    Le seul souci c'est que j'ai une table nommé PHONE qui contient toutes les informations relatives sur les clients dont le NameClient et j'aimerai récupéré à chaque fois 1 nom puis on me fait l'extraction puis le 2eme nom et on me fait l'extraction, tout cela sans que j'ai à intervenir dessus, pouvez-vous m'éclairer sur cette ligne:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WHERE	HST_Currents.Topic_ID BETWEEN 900 AND 902
    AND Phone.Phone_NameClient = @NameClient))
    Pour récupérer tous les clients j'ai essayé de faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET @NameClient = 'DUPONT','MARTIN','MARTY','SULLIVAN','ZUPON'
    Mais lorsque je l'exécute sa m'affiche des erreurs

    Juste 1 autre petite question:

    1) Je dois modifier quelques chose au niveau de ma deuxième requête

  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
    vous pouvez, mais tout dépend de ce que vous voulez faire de ces données ensuite ?
    car créer un job qui fait une requête SELECT n'a pas grand intérêt

  5. #5
    Membre averti
    Inscrit en
    Mai 2011
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 15
    Par défaut
    En fait, j'ai créer une procédure stockée et j'ai apporté les modifications que vous m'avez conseillé. Par la suite, j'aimerai extraire les données de facturaction et les mettre sous fichier Excel (.csv) c'est pourquoi j'aimerai utilisé l'Agent SQL Server. Le seul souci que je rencontre avant c'est le fait que je n'arrive pas à exécuter la procédure stockée pour chaque client, je suis obligé d'écrire les NameClient manuellement. J'aimerai que la variable @NameClient récupère tous les NameClient et que l'extraction se fasse 1 à 1. Actuellement j'exécute cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    DECLARE @RC int
    DECLARE @NameClient nvarchar(10)
     
    SET @NameClient = 'DUPONT'
     
    EXECUTE @RC = [Telephonie_Express_Fr].[dbo].[ExtractFacturePhone] 
       @NameClient
     
    GO
    Merci pour vos réponses qui m'aide énormément.

  6. #6
    Membre averti
    Inscrit en
    Mai 2011
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 15
    Par défaut
    En fait, je vais passer sur ce problème, pour avoir mes données sous format .csv, je dois utiliser cette requête ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DECLARE @BCP VARCHAR(255)
    SET @BCP = 'bcp "maRequeteSQL" queryout C:\ExportDonnes.csv -t; -S monServeur\moninstance -U utilisateurSQL -P motDePasse'
     
    EXEC Master.dbo.xp_cmdshell @BCP --, NO_OUTPUT

Discussions similaires

  1. Problème avec retour d'une procédure stockée
    Par jomphh dans le forum Deski
    Réponses: 22
    Dernier message: 21/11/2007, 23h57
  2. Réponses: 2
    Dernier message: 01/10/2007, 08h38
  3. Réponses: 1
    Dernier message: 06/08/2007, 11h02
  4. [PL/SQL] Appel procédure stockée dans trigger
    Par Félia dans le forum Oracle
    Réponses: 3
    Dernier message: 24/01/2005, 17h25
  5. SQL dans Procédure stockée
    Par julure dans le forum Oracle
    Réponses: 13
    Dernier message: 02/11/2004, 16h57

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