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 :

[SQL2005] [TSQL] Procédure stockée à nombre d'arguments variable


Sujet :

Développement SQL Server

  1. #1
    Invité
    Invité(e)
    Par défaut [SQL2005] [TSQL] Procédure stockée à nombre d'arguments variable
    Bonjour,

    Mon titre doit paraître bizarre, mais c'est tout à fait ça : je ne sais pas combien d'arguments je vais avoir Je m'explique, parce que je sais bien qu'on ne peut pas, comme dans certains langages de programmation faire une procédure à nombre d'arguments non définit.

    Voilà mon problème : je veux faire une procédure permettant de faire une recherche sur une table (ou une jointure de table peu importe), sur une colonne bien précise, qui est en fait est un type d'objet. J'aimerai pouvoir dire "bah maintenant je veux tous les éléments du type X ou Y (donc pas ceux du type Z)" et après dire "cool, maintenant balance moi ceux de type Z ou A)" etc (typiquement, je coche des case dans un formulaire)... En gros, je dois passer à ma procédure une liste de valeur pour la colonne sur laquelle je filtre.

    Quelle est la meilleure solution pour réaliser ce type de procédure ? Sous quelle forme passer mes paramètres ? Je pense que je vais devoir regrouper toutes mes valeurs dans un seul paramètre de la procédure, mais de quelle manière ?

    Note : en plus, c'est encore mieux, je veux deux arguments de ce type dans ma procédure pour filtrer selon deux colonnes

    Merci d'avance pour votre aide !
    Dernière modification par Invité ; 02/07/2008 à 11h39. Motif: Ajout des tags dans le titre

  2. #2
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Bonjour,

    Il faut éviter ce genre de choses pour les performances. Mais c'est possible, soit en passant une chaîne de valeurs que tu découpes dans une fonction utilisateur, soit en passant du XML que tu interprètes avec du XQuery dans ta sproc. Pour XQuery, j'ai écrit un article d'introduction : http://rudi.developpez.com/sqlserver/tutoriel/xquery/
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci rudib ! Je me doute bien qu'au niveau performance, ça doit pas être le mieux, mais je ne vois pas trop d'autres solutions pour cette fonctionnalité... (si quelqu'un voit une autre méthode, je prends ).

    Pour tes deux solutions, j'avais pensé à la première, mais je ne connaissais pas XQuery (merci pour ton tuto, je vais regarder !). Niveau performance, quelle méthode est la meilleure ? Niveau esthétique, je trouve que le XML est un peu mieux peut-être, mais au niveau du programme qui appel la procédure, ça sera peut-être plus complexe...

  4. #4
    Membre actif
    Inscrit en
    Juin 2006
    Messages
    229
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 229
    Points : 266
    Points
    266
    Par défaut
    Moi j'opterais pour le découpage d'un paramètre varchar qui contient tous tes paramètres.

    @+

  5. #5
    Invité
    Invité(e)
    Par défaut
    @Zabriskir: oui, c'est peut-être le plus simple !

    Mais je ne vois pas trop comment écrire le bout de code qui dirait "mes valeurs sont séparées par des ; dans cette chaîne, pour chacune des valeurs, je voudrais que tu fasses ça : blablabla". J'suis pas une pro en T-SQL, quelqu'un aurait un exemple ? J'ai l'impression qu'on est un peu limité au niveau de la manipulation de chaîne et des traitements en boucle...

  6. #6
    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
    Tu as une fonction qui permet de découper une ligne de valeurs en plusieurs ligne d'1 valeur.

    Sûrement pas très propre mais très pratique.

    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
    CREATE FUNCTION [dbo].[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
    Alexandre Chemla - Consultant MS BI chez Masao

  7. #7
    Invité
    Invité(e)
    Par défaut
    Merci pour la fonction Jinroh77

    Finalement, je me suis dit quitte à formater ma chaîne à passer en paramètre, autant la formater directement dans un format exploitable ! Donc, comme je pouvais m'en sortir avec un "colonne in (...)" dans ma requête de sélection, j'ai décider de formater le paramètre directement sous forme de liste utilisable en SQL soit un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'valeur1','valeur2','valeur3'
    Comme ça pas besoin de faire un lourd traitement dans la procédure !

    Merci encore pour vos réponses

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

Discussions similaires

  1. Procédure stockée nombre d'arguments dynamique
    Par avairet dans le forum SQL Procédural
    Réponses: 23
    Dernier message: 19/06/2013, 14h44
  2. [SQL2005] [TSQL] Procédure stockée
    Par Invité dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 28/12/2007, 13h39
  3. [SQL2005] [TSQL] Procédure stockée et paramètres
    Par Invité dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 13/12/2007, 13h53
  4. [SQL2005][TSQL] Procédure Stockée
    Par Cape31 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 03/08/2006, 09h58
  5. Nombre d'arguments variable
    Par gege2061 dans le forum C
    Réponses: 7
    Dernier message: 05/08/2004, 15h43

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