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 :

[SQL2K5] Procédure stockée avec paramètre à valeurs multiple


Sujet :

Développement SQL Server

  1. #1
    Membre chevronné Avatar de Jinroh77
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2006
    Messages
    1 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Février 2006
    Messages : 1 964
    Points : 2 145
    Points
    2 145
    Par défaut [SQL2K5] Procédure stockée avec paramètre à valeurs multiple
    Bonjour à tous,
    Dans le cadre de l'utilisation d'une procédure stockée alimentant un dataset pour Reporting Services, je cherche à créer une procédure à laquelle je peux envoyer un paramètre contenant plusieurs valeurs.

    Par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE PROCEDURE psTest
    	@IdDate		INT
    AS
    BEGIN
     
    SELECT * FROM T_NRM_CALENDRIER
    WHERE Calendrier_Id IN (SELECT @IdDate)
     
    END
    GO
     
    EXEC psTest
    	@IdDate = '1, 2'
    Mais évidement, cela ne fonctionne pas. Impossible de convertir le string '1, 2' en INT.
    Et Si je défini mon paramètre @IdDate en VARCHAR(), je ne peux alors plus m'en servir au sein de la procédure.

    Pour le moment je ne vois que l'utilisation de EXEC('...') mais cela implique d'autres contraintes.

    Merci pour vos idées.
    Alexandre Chemla - Consultant MS BI chez Masao

  2. #2
    Membre chevronné Avatar de Jinroh77
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2006
    Messages
    1 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Février 2006
    Messages : 1 964
    Points : 2 145
    Points
    2 145
    Par défaut
    J'ai finalement trouvé une solution correcte : la suite est la copie d'un post d'autre part.


    Il est possible en reporting services de définir des paramètres acceptant plusieurs valeurs.
    Dans ce cas, lorsque l'on remplit un DataSet à partir d'une procédure stockée on est confronté à la gestion de ce paramètre.


    Il existait 2 solutions pas très clean consistant à
    - utilser une fonction OPENXML pour traiter la chaine de caractères du paramètre et ressortir des lignes (lourd à gérer, en formatage etc... et peu performant)
    - utiliser une commande EXEC(' select .. WHERE champ in ('+@Param+')'). mais cela est très contraignant.

    la solution qui vient maintenant utilise des fonctions qui sont beaucoup plus pratique à gérer.

    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
     
    CREATE FUNCTION fctSplitToVarChar( 
        @DelimitedText VARCHAR(MAX),  -- liste CSV 
        @QuoteChar CHAR(1)            -- caractère de délimitation 
    ) RETURNS @Items TABLE (Item VARCHAR(MAX)) 
    BEGIN 
     
       DECLARE @Item VARCHAR(15) 
       WHILE CHARINDEX(@QuoteChar, @DelimitedText, 0) <> 0 BEGIN 
            SELECT @Item=SUBSTRING(@DelimitedText,1,CHARINDEX(@QuoteChar,@DelimitedText, 0)-1), 
                   @DelimitedText=SUBSTRING(@DelimitedText,CHARINDEX(@QuoteChar,@DelimitedText, 0) + LEN(@QuoteChar), LEN(@DelimitedText)) 
            IF LEN(RTRIM(@Item)) > 0 
                INSERT INTO @Items SELECT @Item 
       END 
    -- Dernier item de la liste 
       IF LEN(RTRIM(@DelimitedText)) > 0 
           INSERT INTO @Items SELECT @DelimitedText 
       RETURN 
    END

    Cette fonction retourne une chaine de caractères en plusieurs lignes.
    Appel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    DECLARE @ListID VARCHAR(MAX) 
    SET @ListID= '35143193700025,34023496205248,34023496206857' 
    SELECT Item FROM fctSplitToVarChar(@ListID, ',')
    Résultat :
    35143193700025
    34023496205248
    34023496206857


    On peut alors faire appel à cette fonction dans le code de la procédure stockée pour récupérer les données qui nous intéresse.

    Bonne utilisation.
    Alexandre Chemla - Consultant MS BI chez Masao

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

Discussions similaires

  1. Procédure stockée avec paramètre à valeurs multiples
    Par kardes27 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 18/09/2013, 19h26
  2. Réponses: 5
    Dernier message: 01/05/2013, 14h29
  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. Réponses: 0
    Dernier message: 15/04/2010, 13h54
  5. SQL - Procédure stockée avec paramètres
    Par jacquesprogram dans le forum VB.NET
    Réponses: 2
    Dernier message: 23/03/2009, 11h17

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