Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/07/2008, 11h36   #1
Nouveau Membre du Club
 
Développeur Web
Inscription : novembre 2007
Messages : 141
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Bas Rhin (Alsace)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : novembre 2007
Messages : 141
Points : 34
Points : 34
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 !
Laewella est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2008, 12h34   #2
Expert Confirmé
 
Avatar de rudib
 
Inscription : mai 2006
Messages : 2 236
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mai 2006
Messages : 2 236
Points : 2 983
Points : 2 983
Envoyer un message via ICQ à rudib Envoyer un message via MSN à rudib
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
Consultant indépendant
modélisation, administration, optimisation, formation,
solutions MS SQL Server et informatique libre.
MCDBA, MCITP, MCT, SCJP2 - http://www.babaluga.com/
Articles et tutoriels : http://rudi.developpez.com/
LIVRE : Optimiser SQL Server
rudib est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2008, 13h40   #3
Nouveau Membre du Club
 
Développeur Web
Inscription : novembre 2007
Messages : 141
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Bas Rhin (Alsace)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : novembre 2007
Messages : 141
Points : 34
Points : 34
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...
Laewella est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2008, 14h21   #4
Membre actif
 
Inscription : juin 2006
Messages : 161
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 161
Points : 154
Points : 154
Moi j'opterais pour le découpage d'un paramètre varchar qui contient tous tes paramètres.

@+
Zabriskir est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2008, 14h54   #5
Nouveau Membre du Club
 
Développeur Web
Inscription : novembre 2007
Messages : 141
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Bas Rhin (Alsace)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : novembre 2007
Messages : 141
Points : 34
Points : 34
@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...
Laewella est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2008, 15h32   #6
Modérateur
 
Avatar de Jinroh77
 
Homme Alexandre Chemla
Consultant en Business Intelligence
Inscription : février 2006
Messages : 1 782
Détails du profil
Informations personnelles :
Nom : Homme Alexandre Chemla
Âge : 28
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence

Informations forums :
Inscription : février 2006
Messages : 1 782
Points : 1 853
Points : 1 853
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 :
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
Jinroh77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2008, 08h25   #7
Nouveau Membre du Club
 
Développeur Web
Inscription : novembre 2007
Messages : 141
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Bas Rhin (Alsace)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : novembre 2007
Messages : 141
Points : 34
Points : 34
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 :
'valeur1','valeur2','valeur3'
Comme ça pas besoin de faire un lourd traitement dans la procédure !

Merci encore pour vos réponses
Laewella est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h44.


 
 
 
 
Partenaires

Hébergement Web