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 :

Procédure stockée: recherche multi-critères


Sujet :

MS SQL Server

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2004
    Messages : 12
    Points : 9
    Points
    9
    Par défaut Procédure stockée: recherche multi-critères
    Bonjour à tous,

    J'aimerais connaître la meilleure façon d'effectuer une recherche multi-critères pouvant comporter jusqu'à 50 critères, avec une procédure stockée.

    Est-ce possible de "subdiviser" la recherche à l'aide de plusieurs procédures (i.e. effectuer une autre recherche sur un "recordset" obtenu d'une première procédure et ainsi de suite, ou autre façon...),

    sinon, si on utilise qu'une seule procédure, y a-t-il danger de "lenteur" à cause de la lourdeur de recherche?

    Merci à l'avance de votre aide.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 117
    Points : 97
    Points
    97
    Par défaut salut
    Une recherche ou un filtrage de lignes sur critères ?

    Si c'est le 1er, ça dépend de comment tu vas construire ton where, et comment tu veux gérer les pertinences.

    Si c'est le 2eme, moi perso je passe tous mes parametres de recherche à une procédure, et je construis un "where" dynamique en tenant compte de s'ils sont renseignés ou non. Pour 50 critères c'est tranquilou je pense.

    a+

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2004
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    Merci romainw,

    J'aimerais savoir ce que tu entends exactement par Recherche?. J'ai fait un petit test fonctionnel ("Where" dynamique), mais avec que 2 variables en entrée, au lieu de 50. J'aimerais que tu me confirmes qu'il s'agit bien d'un filtrage par lignes avec critères:

    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
    CREATE PROCEDURE sp_ChaineSQLAvecCondition
    	(
    		@temperatureInterne INT,
    	 	@calibre NVARCHAR(10)
    	)
    AS
    	DECLARE @CHAINESQL AS NVARCHAR(4000)		
    	BEGIN
    		SET NOCOUNT OFF 	  										
    		SELECT @CHAINESQL = 'SELECT dbo.Localisations.loc_nomTerritoire, dbo.Points.poi_temperatureInterne, dbo.Points.poi_calibre ' +
    					'FROM dbo.Points ' +
    					'INNER JOIN dbo.Localisations '  +
    					'ON dbo.Points.poi_num = dbo.Localisations.loc_num '						
    		IF (@temperatureInterne > -10)  -- Vérifie si valeur prise en compte EXEMPLE
    			BEGIN
    				SET @CHAINESQL =   @CHAINESQL + N'WHERE (dbo.Points.poi_temperatureInterne > @temperatureInterne)'	
    			END
    		IF ( @calibre <> '')                    -- Vérifie si valeur prise en compte EXEMPLE
    			BEGIN
    				SET @CHAINESQL =   @CHAINESQL + N' AND (dbo.Points.poi_calibre = @calibre)'
    			END
    		-- IF etc etc 
    		EXEC sp_executesql  @CHAINESQL, N'@temperatureInterne INT, @calibre NVARCHAR(10)', @temperatureInterne, @calibre	 	
    	 END 
    RETURN

    Les champs affichés seront fixes (environ une dizaine). Ce sont les critères (nombre et valeurs) qui varieront.

    Merci beaucoup!

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 117
    Points : 97
    Points
    97
    Par défaut salut
    par "recherche", j'entends un ptit moteur de recherche sur des champs texte, mais bon ça n'est pas le cas apparemment, c'est + du filtrage.

    Sinon fais attention sur la construction du where, si le 1er critere est nul et le 2eme non, tu vas avoir un truc de genre 'SELECT * FROM TABLE AND CHAMPCRITERE=' + @Critere...

    La logique à l'air bonne sinon
    a+

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2004
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    Merci romainw,

    Oui j'avais vu au sujet du 1er critère non pris en compte, et ce qui est bizarre, c'est que même si je mets le 1er carrément en commentaires, c comme si le 'AND' du second équivalait à un 'where'. De toute façon, je vais l'arranger: je ne prendrai pas de chance avec ça.

    Autre question: est-il possible de créer une fonction de validation sur des valeurs entrées à l'intérieure même d'une procédure stockée?

    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 PROC....
    (@var1 AS INT,
    @var2 AS INT,
    @res AS CHAR(5))
     
    AS
    BEGIN
            IF (@var1 > 3)
                    @res = fct_ValiderVar1(arg1, arg2...)
            END
            ......
    END
    RETURN
    Merci!

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 117
    Points : 97
    Points
    97
    Par défaut bien sur
    oui tu peux très bien faire ça !

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2004
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    Bonjour romainw,

    Comme j'aurai environ un vingtaine de validations à effectuer dans ma requête, j'ai tenté d'effectuer une fonction de validation appelée à l'extérieur
    de ma procédure afin d'alléger le code. Actuellement, ceci me retourne un recordset avec la bonne chaine demandée selon l'opérateur.
    J'aimerais pouvoir recueillir cette chaine afin de la concaténer au fur et à mesure que je construis ma requête:

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    CREATE PROCEDURE sp_ChaineSQLAvecOperateurs
    	(
    		@temperatureInterne REAL, 
    		@operateurTI INT,
    		@calibre VARCHAR(10)
    	)
    AS
    	DECLARE  @CHAINESQL AS NVARCHAR(4000)
     
    	BEGIN
    		SET NOCOUNT OFF 	  										
    		SELECT @CHAINESQL = 'SELECT dbo.Localisations.loc_nomTerritoire, dbo.Points.poi_temperatureInterne, dbo.Points.poi_calibre ' +
    				    'FROM dbo.Points ' +
    				    'INNER JOIN dbo.Localisations '  +
    				    'ON dbo.Points.poi_num = dbo.Localisations.loc_num ' +
    				    'WHERE (dbo.Localisations.loc_num <> 0) '
     
    		-- Valider et concatener les criteres de filtrage dans le WHERE dynamique:
     
    		IF (@temperatureInterne > -10)  -- Vérifie si valeur prise en compte depuis l'interface 
    			BEGIN
    				--Dans le recorset, retourne la bonne chaine selon operateur:	
    		      SELECT dbo.fct_validerTemperature (@temperatureInterne, @operateurTI)
     
    				-- Comment recueillir et concatener avec la string finale?:  
    				--SET @CHAINESQL =  @CHAINESQL + dbo.fct_validerTemperature (@temperatureInterne, @operateurTI) 
     
    			END
     
    		IF ( @calibre <> '')                   
    			BEGIN
    				-- Meme validation a effectuer ici:
    				-- SET @CHAINESQL =  @CHAINESQL + dbo.fct_validerCalibre (@calibre, @operateurCAL)
    				-- ...
    			END
     
    		EXEC sp_executesql  @CHAINESQL, N'@temperatureInterne REAL, @calibre VARCHAR(10)', @temperatureInterne, @calibre	 	
    	 END 
    RETURN
    Voici le code de la fonction "fct_ValiderTemperature":


    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
    28
    CREATE FUNCTION dbo.fct_ValiderTemperature
    	(	@temperatureInterne AS REAL,
    		@operateurTI INT
    	)
     
    RETURNS NVARCHAR(300)
     
    AS		
    	BEGIN
    	/*
    	0 est =
    	1 est >
    	2 est <
    	3 est < ou =
    	4 est > ou =
    	5 est <>
    	*/
    		IF (@operateurTI = 0) 
    			BEGIN
    		 		RETURN ( N' AND (dbo.Points.poi_temperatureInterne > @temperatureInterne)' )
    			END
     
    		IF (@operateurTI = 1) 
    			BEGIN
    		 		RETURN ( N' AND (dbo.Points.poi_temperatureInterne = @temperatureInterne)' )
    			END
    		RETURN('')			
    	END
    Merci a+

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2004
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    ça fonctionne avec:

    SET @CHAINESQL = @CHAINESQL + dbo.fct_validerTemperature (@temperatureInterne, @operateurTI)

  9. #9
    Membre actif Avatar de chris81
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 626
    Points : 298
    Points
    298
    Par défaut petit pb
    bonjour,
    le debute en sql et j'aimerai savoir comment faire que ma procedure stockée me retourne 1 si le SELECT Count.... est >0 et -1 si mon SELECT Count.... est < 0

    pourriez vous m'aidez merci

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 117
    Points : 97
    Points
    97
    Par défaut salut
    tu aurais du faire un nouveau post, mais bon c pas grave. En gros ça donne :

    ......
    DECLARE @count as integer
    DECLARE @retour
    ......
    SELECT @count = count(*) from table where....
    ......
    IF @count < 0
    SELECT @retour = -1
    ELSE
    SELECT @retour = 0
    ......

    SELECT @retour --Renvoie la valeur...

  11. #11
    Membre actif Avatar de chris81
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 626
    Points : 298
    Points
    298
    Par défaut
    tu es sur que c du sql???
    il me retourne que des erreurs, il connait pas declare et le as c'est en vb!!!
    je suis sur sql serveur 2000

  12. #12
    Membre actif Avatar de chris81
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 626
    Points : 298
    Points
    298
    Par défaut
    c bon merci en fait il manquait integer devant retour

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

Discussions similaires

  1. Procédure pour la recherche multi-critères
    Par Lycoz dans le forum Access
    Réponses: 5
    Dernier message: 22/09/2006, 14h11
  2. Recherche multi-critères
    Par PAUL87 dans le forum Access
    Réponses: 66
    Dernier message: 13/12/2005, 12h12
  3. problème SQL avec le tutoriel recherche multi critère
    Par qbihlmaier dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 05/12/2005, 19h33
  4. problème avec résultat de recherche multi-critères
    Par audrey_desgres dans le forum Access
    Réponses: 2
    Dernier message: 23/06/2005, 11h00
  5. Procédure stockée et multi utilisateurs
    Par Bruno34 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 30/04/2003, 15h32

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