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 :

Creer une requete imbriquée avec parametres


Sujet :

Développement SQL Server

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 10
    Points : 6
    Points
    6
    Par défaut Creer une requete imbriquée avec parametres
    Bonjour,

    Voila, je suis apprenti en informatique.
    Je travaille sur une application vb.net avec une base de données MS SQL SERVER, la base de donnée s'appelle courrier.
    L'application recense tous les courriers recus et envoyes...

    En fait j'affiche les courriers recu ou envoyes d'apres une recherche.
    J'utilise une procedure stockée qui prend en parametre les donnes selectionnées, cette procedure stockee traite les infos presentes et construit la requete correspondante a la recherche:

    procedure de selection courrier envoyé

    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    Declare @requete varchar(3000)
    Declare @select varchar(1000)
    Set @select ='SELECT mail.Chrono as Chrono, mail.DateEmission as DateEmission, mail.Objet as Objet, mail.Classement as Classement, mail.Référence as Référence, MAX(inter.Nom) AS Expéditeur, MIN(inter2.Nom) AS Destinataire, inter3.Nom AS Rédacteur, mail.Type AS Type, mail.CodeCourrier AS CodeCourrier,mail.Année As Annee '
    print @select
    SET @strSQL ='FROM dbo.Intervenant inter3 LEFT OUTER JOIN dbo.AssociationCourrierIntervenant j3 ON inter3.CodeIntervenant = j3.CodeIntervenant RIGHT OUTER JOIN dbo.Intervenant inter LEFT OUTER JOIN dbo.AssociationCourrierIntervenant j ON inter.CodeIntervenant = j.CodeIntervenant RIGHT OUTER JOIN dbo.Courrier mail ON j.CodeCourrier = mail.CodeCourrier AND j.Nature LIKE ''Expéditeur'' LEFT OUTER JOIN dbo.AssociationCourrierIntervenant j2 ON j2.CodeCourrier = mail.CodeCourrier AND j2.Nature Like ''Destinataire'' AND j2.CodeIntervenant <> j.CodeIntervenant LEFT OUTER JOIN dbo.Intervenant inter2 ON j2.CodeIntervenant = inter2.CodeIntervenant ON j3.CodeCourrier = mail.CodeCourrier AND j3.Nature LIKE ''Rédacteur'' '
    --print @strSQL
    Set @requete = @Select +', '''+@NomSession+'''  '+@strSQL
     
    Set @Groupby='GROUP BY mail.Objet, inter3.Nom, mail.CodeCourrier,mail.Année, mail.Chrono, mail.Type, mail.CodeService, mail.Référence, mail.Classement, mail.DateEmission, mail.Référence,mail.DateRéception '
    SET @Having='HAVING (mail.Année = '+@annee+') AND (mail.CodeService ='+ @CodeService+') AND (mail.Type = 1) '
    SET @Orderby ='ORDER BY mail.Chrono'
    Set @strSQL = @select + @strSQL
    print @strSQL
     
    SET @Condition ='WHERE '
    If @CodeIntervenant !=0
    	begin 
    	--print @Nature
    	if @Nature = 'Expéditeur'
    		Set @inter='inter.CodeIntervenant='+@CodeIntervenant+' '
    	if @Nature= 'Destinataire'
    		Set @inter='inter2.CodeIntervenant='+@CodeIntervenant+' '
    	if @Nature= 'Copie'
    		Set @inter='inter3.CodeIntervenant='+@CodeIntervenant+' '
    	if @Nature =''
    		Set @Inter ='inter.CodeIntervenant='+@CodeIntervenant+'  OR inter2.CodeIntervenant='+@CodeIntervenant+'  OR inter3.CodeIntervenant='+@CodeIntervenant+' '
    	SEt @strSQL = (@strSQL +@Condition+@Inter)
    	SEt @requete = (@requete +@Condition+@Inter)
     
     
    	--print (@strSQL)	
    end
     
     
     
    If @Objet <>''
    	begin
    	SET @Having = (@Having +'AND mail.Objet  LIKE ''%' +@Objet+'%''  ')
    	end
    If @Ref <>''
    	begin
    	SET @Having = (@Having +'AND mail.Référence='''+@Ref+''' ')
    	end
    If @Class <>''
    	begin
    	SET @Having = (@Having +'AND mail.Classement='''+@Class+''' ')
    	end
    If @Chrono <>''
    	begin
    	SET @Having = (@Having +'AND mail.Chrono='''+@Chrono+''' ')
    	end
     
    If  @Datedeb <>''
    	begin
    	SET @Having = (@Having +'AND mail.DateRéception BETWEEN '''+@Datedeb+''' AND '''+@Datefin+''' ')
    	end
     
    --print @having
    SELECT @strSQL = @strSQL + @Groupby+ @Having  --+ @Orderby	
    SELECT @requete = @requete + @Groupby+ @Having  --+ @Orderby	
     
    print @requete
    exec (@strSQL)
    En fait, ma recherche prend en compte les utilisateurs suivants :
    -expediteur
    -destinataire
    -en copie

    Mais il me faut aussi la possibilité de choisir :
    -le redacteur
    - fax

    J'ai un peu les memes soucis pour les courriers recus...

  2. #2
    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 : 53
    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
    C'est excessivement compliqué ce que tu proposes. Autant on peut comprendre qu'un client de type php, VB.net, asp, etc... construise une requête de cette façon (et encore il y a les requêtes par bind variables), autant de SQL server vers SQL server c'est se compliquer la vie pour rien alors que Transact SQL peut executer du SQL en direct avec des paramètres.

    On pourrait faire
    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
    ALTER PROCEDURE TaProcedure
        @annee varchar(4),
        @CodeService varchar(10),
        @Nature  varchar(10),
       @NomSession varchar(10)
     /*  etc... si besoin de d'autres paramètres */
    AS
     
    SELECT mail.Chrono as Chrono, mail.DateEmission as DateEmission, 
    mail.Objet as Objet, mail.Classement as Classement, 
    mail.Référence as Référence, MAX(inter.Nom) AS Expéditeur, 
    MIN(inter2.Nom) AS Destinataire, inter3.Nom AS Rédacteur, 
    mail.Type AS Type, mail.CodeCourrier AS CodeCourrier,
    mail.Année As Annee
    FROM dbo.Intervenant inter3 
    LEFT OUTER JOIN dbo.AssociationCourrierIntervenant j3 ON inter3.CodeIntervenant = j3.CodeIntervenant 
    RIGHT OUTER JOIN dbo.Intervenant inter 
    LEFT OUTER JOIN dbo.AssociationCourrierIntervenant j ON inter.CodeIntervenant = j.CodeIntervenant 
    RIGHT OUTER JOIN dbo.Courrier mail ON j.CodeCourrier = mail.CodeCourrier AND j.Nature LIKE 'Expéditeur' 
    LEFT OUTER JOIN dbo.AssociationCourrierIntervenant j2 ON j2.CodeCourrier = mail.CodeCourrier AND j2.Nature Like 'Destinataire' AND j2.CodeIntervenant <> j.CodeIntervenant 
    LEFT OUTER JOIN dbo.Intervenant inter2 ON j2.CodeIntervenant = inter2.CodeIntervenant ON j3.CodeCourrier = mail.CodeCourrier AND j3.Nature LIKE 'Rédacteur'
    WHERE 
    (	@Nature = 'Expéditeur' AND inter.CodeIntervenant=@CodeIntervenant)
    OR
    (	@Nature = 'Destinataire' AND inter2.CodeIntervenant=@CodeIntervenant)
    OR /* le OR est inclusif */
    (	@Nature = 'Copie' AND inter3.CodeIntervenant=@CodeIntervenant)
    GROUP BY mail.Objet, inter3.Nom, mail.CodeCourrier,mail.Année, mail.Chrono, mail.Type, mail.CodeService, mail.Référence, mail.Classement, mail.DateEmission, mail.Référence,mail.DateRéception 
    /* Le Having est bizarre car il devrait porter sur des fonctions de regroupement */
    HAVING (mail.Année = @annee) AND (mail.CodeService = @CodeService) AND (mail.Type = 1) 
     
    GO
    Je te laisse compléter la procédure selon tes besoins avec ce principe. Je n'ai pas fait la partie HAVING comme la partie WHERE. A toi de la faire.

    edit: des LIKE sans % ne servent à rien: autant faire une égalité stricte pour mieux utiliser les index. A moins que tu ne saches pas à l'avance ce que tu auras dans les LIKE.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Merci, je complete le code et je le teste.
    J'essairait de mettre le resultat...

    edit: Mais bon j'avais deja essayer des trucs semblabes et seul la solution que je t'ai donnée convenait...
    Ca fait trois mois que je n'ai pas touché au code, donc je ne pourrais pas dire exactement ce qui n'allait pas...

Discussions similaires

  1. Creer une requete SQL avec la fonction PIVOT
    Par SALIA LOUA OLIVIER dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 09/10/2013, 15h35
  2. Creer une requete imbriquée avec parametres
    Par ramazan dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 03/01/2008, 11h30
  3. Oracle/XML avec une requete imbriquée
    Par FABFAB125 dans le forum SQL
    Réponses: 16
    Dernier message: 20/07/2007, 12h52
  4. [Access] Comment créer une requete avec la date
    Par Daniela dans le forum Langage SQL
    Réponses: 1
    Dernier message: 27/09/2006, 11h06
  5. Creer une requete avec des LEFT JOIN et des GRO
    Par donbuz dans le forum Langage SQL
    Réponses: 2
    Dernier message: 01/09/2004, 15h53

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