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 :

Procédure Stockée avec paramètres


Sujet :

Développement SQL Server

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    490
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 490
    Points : 201
    Points
    201
    Par défaut Procédure Stockée avec paramètres
    Bonjour, je débute dans les PS et j'aurais besoin de votre. J'ai une procédure stockée qui reçoit 1 paramètre voire 2. je voudrais, que si mon 2ème paramètre est renseigné, mettre un "AND" dans la clause WHERE de ma requete.

    j'aurais voulu faire un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IF @Param2 <>'' THEN maRequete = ' AND param2=@Param2 ELSE maRequete=''
    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
    CREATE PROCEDURE [dbo].[maProcedure]
    @Param1 varchar(20),
    @Param2 varchar(20)
    AS
    BEGIN
     
    DECLARE @SQL varchar(50)		
    	IF @Param2='' 
    		SET @SQL='' 
    	ELSE 
    		SET @SQL= 'AND partage='''+@Param2+''
    IF OBJECT_ID('#monFichierXML') IS NOT NULL
    		BEGIN
    			DROP TABLE #monFichierXML;
    		END	
     
           BEGIN
    		SELECT * INTO #monFichierXML  FROM Matable WHERE Matricule=@param2 +@SQL
           END
    END
    comment faire pour faire un genre de concaténation de bout de requête ? Est-ce possible ?

    Merci d'avance pour votre aide.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Pourquoi faire simple quand on peut faire compliquer ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE PROCEDURE [dbo].[maProcedure] @Param1 varchar(20), @Param2 varchar(20) AS
    BEGIN
    	IF OBJECT_ID('#monFichierXML') IS NOT NULL
    		DROP TABLE #monFichierXML;
     
    	IF @Param2='' OR @Param2 IS NULL
    		SELECT * INTO #monFichierXML  FROM Matable WHERE Matricule=@param1
    	ELSE 
    		SELECT * INTO #monFichierXML  FROM Matable WHERE Matricule=@param1 AND partage= @Param2
    END

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    490
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 490
    Points : 201
    Points
    201
    Par défaut
    Merci pour ta réponse.

    Cependant, j'ai un message d'erreur "il existe déjà un objet nommé #monFichierXML dans la base de données " quand je lance la création me disant que #monFichierXML existe déjà (dans mon else)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE PROCEDURE [dbo].[maProcedure] @Param1 varchar(20), @Param2 varchar(20) AS
    BEGIN
    	IF OBJECT_ID('#monFichierXML') IS NOT NULL
    		DROP TABLE #monFichierXML;
     
    	IF @Param2='' OR @Param2 IS NULL
    		SELECT * INTO #monFichierXML  FROM (SELECT A UNION ALL SELECT B WHERE Matricule=@param1) as Matable 
    	ELSE 
                    SELECT * INTO #monFichierXML  FROM (SELECT A UNION ALL SELECT B WHERE Matricule=@param1 AND partage= @Param2) as Matable 
     
    END

  4. #4
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    IF OBJECT_ID('tempdb..#monFichierXML') IS NOT NULL
    	DROP TABLE #monFichierXML;

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    490
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 490
    Points : 201
    Points
    201
    Par défaut
    oui je l'ai bien c'est bien le problème, avec le ; à la fin ?

  6. #6
    Invité
    Invité(e)
    Par défaut
    Le point virgule, il me semble que c'est la norme SQL, mais SQL Server ne l'a pas encore rendu obligatoire. Conclusion, tu fais comme tu le sens, ce n'est pas obligatoire !

  7. #7
    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
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Non, je pense qu'il s'agit d'une erreur de parsing.

    Au moment de l'analyse, SQL Server n'évalue pas les condition, et voit donc deux lignes créant une table #monFichierXML. Il bloque donc pour la deuxième.

    Vous pouvez inclure la condition dans la requete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     SELECT * INTO #monFichierXML  FROM (
        SELECT A 
        UNION ALL SELECT B 
        WHERE Matricule=@param1 
        AND (
            @Param2='' OR @Param2 IS NULL
           OR  partage= @Param2
        )
    ) as Matable

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Au moment de l'analyse, SQL Server n'évalue pas les condition, et voit donc deux lignes créant une table #monFichierXML. Il bloque donc pour la deuxième.
    Merci je n'avais pas testé et pas compris l'erreur en fait.

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    490
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 490
    Points : 201
    Points
    201
    Par défaut
    Merci aieeeuuuuu pour ta réponse.

    Donc pour bien comprendre je remplace le "IF - ELSE " par ta condition. mais qu'est-ce que ça fait exactement, j'ai du mal à comprendre comment on peut remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IF @Param2='' OR @Param2 IS NULL ELSE..
    PAR CE CODE...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     AND (
            @Param2='' OR @Param2 IS NULL
           OR  partage= @Param2
        )
    Merci

  10. #10
    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
    Points : 13 092
    Points
    13 092
    Par défaut
    du fait des OR, partage= @Param2 ne sera pris en compte que si les deux conditions @Param2='' et @Param2 IS NULL sont fausses

Discussions similaires

  1. Réponses: 5
    Dernier message: 01/05/2013, 14h29
  2. Réponses: 1
    Dernier message: 23/08/2010, 12h13
  3. Lancement d'une procédure stockée avec paramètres
    Par ptitenana_vtq dans le forum Développement de jobs
    Réponses: 2
    Dernier message: 08/06/2010, 15h16
  4. SQL - Procédure stockée avec paramètres
    Par jacquesprogram dans le forum VB.NET
    Réponses: 2
    Dernier message: 23/03/2009, 11h17
  5. [SQL2K5] Procédure stockée avec paramètre à valeurs multiple
    Par Jinroh77 dans le forum Développement
    Réponses: 1
    Dernier message: 16/05/2008, 17h31

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