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 :

Ajout d'une chaine de caracteres dans la clause where


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 12
    Par défaut Ajout d'une chaine de caracteres dans la clause where
    Bonjour,
    Voila, j ai un petit soucis avec ma procedure stockee.
    Je voudrais pouvoir rajouter des contraintes à la selection lorsque @Prescripteur n'est pas egal à NULL
    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
    CREATE PROCEDURE SelectionPiece(
           @IdResidence AS varchar(128),
           @Prescripteur AS INT
    )
    AS BEGIN
     
    DECLARE @PrescripteurQuery varchar(128)
     
    IF (@Prescripteur IS NOT NULL)
       BEGIN
            SET @PrescripteurQuery = 'AND gl.idPrescripteurPreResa = '+@Prescripteur
       END
    ELSE
        BEGIN
             SET @PrescripteurQuery = ''
        END
     
         SELECT gl.Batiment,
                CASE
                    WHEN (gl.Statut = 'Al. ss nom') THEN p.PrescripteurSociete
                    ELSE ''
                END
         FROM grillelot gl
              LEFT OUTER JOIN prescripteur p ON gl.idPrescripteurPreResa = p.PrescripteurId
         WHERE gl.IdResidence = @IdResidence
     
    END
    Donc je SET @PrescripteurQuery à vide si @Prescripteur est NULL ,
    sinon j aimerais rajouter dans mon SELECT une ou plusieurs contraintes en plus, genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WHERE gl.IdResidence = @IdResidence
    @PrescripteurQuery
    Mais ceci ne marche pas ...
    Les contraintes supplémentaires étant écrites en dur comme dans le code plus haut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @PrescripteurQuery = 'AND gl.idPrescripteurPreResa = '+@Prescripteur
    Auriez-vous une solution a me proposer svp?
    Merci d'avance

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 356
    Par défaut
    Il faut utiliser une requête dynamique.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    DECLARE @query VARCHAR(8000)
    SET @query='SELECT gl.Batiment,
                CASE
                    WHEN (gl.Statut = 'Al. ss nom') THEN p.PrescripteurSociete
                    ELSE ''
                END
         FROM grillelot gl
              LEFT OUTER JOIN prescripteur p ON gl.idPrescripteurPreResa = p.PrescripteurId
         WHERE gl.IdResidence = '+@IdResidence+' '+@PrescripteurQuery
    EXECUTE(@query)
    Ca devrait fonctionner.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 12
    Par défaut
    merci pour ta réponse
    mais quand je compil il me met une erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     WHEN (gl.Statut = 'Al. ss nom') THEN p.PrescripteurSociete
    Ligne 22 : syntaxe incorrecte vers 'Al'
    Saurais tu pourquoi?

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 356
    Par défaut
    Désolé, je fais cette erreur souvent; la cote étant le caractère de fin de chaîne, il faut la doubler pour qu'elle ne soit pas interprété dans la requête dynamique :

    Correction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    DECLARE @query VARCHAR(8000)
    SET @query='SELECT gl.Batiment,
                CASE
                    WHEN (gl.Statut = ''Al. ss nom'') THEN p.PrescripteurSociete
                    ELSE ''''
                END
         FROM grillelot gl
              LEFT OUTER JOIN prescripteur p ON gl.idPrescripteurPreResa = p.PrescripteurId
         WHERE gl.IdResidence = '+@IdResidence+' '+@PrescripteurQuery
    EXECUTE(@query)

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 12
    Par défaut
    merci beaucoup pour ton aide Madinico
    Mais j aurais encore besoin de tes lumières ou celle de quelqu' un d autre bien sûr
    En fesant ca je pensai que ca marcherai mais il me met une erreur :
    'MIREVAL_Ancien_EHPAD_01' : nom de colonne incorrect.
    Sachant que MIREVAL_Ancien_EHPAD_01 est la valeur passe en parametre pour @IdResidence
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE gl.IdResidence = '+@IdResidence
    Pourquoi il considère que le paramètre est un nom de colonne et non pas une variable quelconque?
    Est ce encore un probleme de quotes?

    Parce que si j ecris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE gl.IdResidence = ''MIREVAL_Ancien_EHPAD_01'' '
    cela marche

    Merci pour votre aide

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 12
    Par défaut
    Trouvez-vous que ceci est codé salement?
    Si oui avez vous une autre solution?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    DECLARE @Tri varchar(128)
    SET @Tri = 'ORDER BY NumLotGDP'
    DECLARE @query VARCHAR(8000)
    SET @query='SELECT gl.NumLotGDP,
                CASE
                    WHEN (gl.Statut = ''Al. ss nom'') THEN p.PrescripteurSociete
                    ELSE ''''
                END
         FROM grillelot gl
              LEFT OUTER JOIN prescripteur p ON gl.idPrescripteurPreResa = p.PrescripteurId
         WHERE gl.IdResidence '
     
    EXECUTE(@query+@IdResidence+@Tri)
    Sachant que @idResidence est un parametre varchar(128) passé sous la forme --> ='MIREVAL_Ancien_EHPAD_01'
    J'ai trouvé que cette solution qui marche
    Merci de votre aide

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

Discussions similaires

  1. erreur pour une insertion d'une chaine de caractere dans une cellule
    Par amel95140 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/10/2006, 09h09
  2. Réponses: 10
    Dernier message: 16/06/2006, 13h53
  3. Réponses: 10
    Dernier message: 22/05/2006, 11h45
  4. Réponses: 2
    Dernier message: 04/11/2005, 11h35
  5. [Debutant] Mettre une chaine de caractere dans un tableau
    Par bouboussjunior dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 14/09/2004, 11h33

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