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 :

[Sql 2005]Intersect dans une boucle ou sur des procedures stoquées


Sujet :

MS SQL Server

  1. #1
    Membre confirmé
    Avatar de frechy
    Inscrit en
    Novembre 2004
    Messages
    343
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Novembre 2004
    Messages : 343
    Points : 511
    Points
    511
    Par défaut [Sql 2005]Intersect dans une boucle ou sur des procedures stoquées
    Hello,



    J'ai construit une requette qui permet de faire des recherches sur une DB Sql 2005.

    Tout ca pour au final faire un moteur de recherche sur des employés d'une société.


    Ma requette fonctionne bien avec un mot, mais pas avec plusieurs.

    Si je tappes "Jean Dupont", je devrais avoir l'intersection du résultat sur Jean et du résultat sur Dupont.



    Plusieurs solutions;
    - mettre en place le fulltext
    Malheureusement je suis trop court en temps...mise en prod vendredi et d'autres problèmes à régler.

    - éxecuter mes procédures stoquées avec intersect
    Mais ceci ne fonctionne pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    EXEC WiQSearch 'Jean'
    INTERSECT
    EXEC WiQSearch 'Dupont'
    Si quelqu'un sait comment contourner le problème cela serait le plus simple pour moi.
    Je construirais la requette dans le code puis l'executer

    - Effectuer l'intersect dans la procédure stoquée, à l'interieur d'une boucle
    Là je ne vois vraiment pas comment je pourrais faire

    - Construire toute la requette dans le code puis l'executer
    Facile à faire, mais pas dutout optimisé (il me semble)



    Pour vous donner une idée, voici ma procédure stoquée:
    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
    ALTER PROCEDURE [dbo].[WiQSearch]
    	@Search nvarchar(100)
    AS
    BEGIN
     
    	SET NOCOUNT ON;
     
    SELECT     Profil.IdProfil, Profil.DateMiseVigueur, Profil.UserIdSibelga AS UserId, Profil.Nom, Profil.Prenom, 
               COALESCE(RTRIM(Departement.NomFR) + '/' + RTRIM(Departement.NomNL), RTRIM(Departement.NomFR), RTRIM(Departement.NomNL)) AS Departement, 
    			COALESCE(RTRIM(Service.NomFR) + '/' + RTRIM(Service.NomNL), RTRIM(Service.NomFR), RTRIM(Service.NomNL)) AS Service
    FROM         Profil INNER JOIN
                          ProfilInterne ON Profil.IdProfil = ProfilInterne.IdProfil AND Profil.DateMiseVigueur = ProfilInterne.DateMiseVigueur INNER JOIN
                          Service ON Profil.IdService = Service.IdService INNER JOIN
                          Departement ON Service.IdDepartement = Departement.IdDepartement INNER JOIN
                          Fonction ON ProfilInterne.IdFonction = Fonction.IdFonction INNER JOIN
                          LocalisationBatiment ON Profil.IdLocalisationBatiment is NULL OR Profil.IdLocalisationBatiment = LocalisationBatiment.IdLocalisationBatiment
    WHERE Profil.UserIdSibelga LIKE '%' + @Search +'%' OR Profil.Nom LIKE '%' + @Search +'%' OR Profil.Prenom LIKE '%' + @Search +'%' OR Profil.NumTelFixe LIKE '%' + @Search +'%' OR Profil.NumGSM LIKE '%' + @Search +'%' OR Profil.NumFax LIKE '%' + @Search +'%' OR LocalisationBatiment.Nom LIKE '%' + @Search +'%'
    		OR Fonction.NomFR LIKE '%' + @Search +'%' OR Fonction.NomNL LIKE '%' + @Search +'%'
    OR Departement.NomFR LIKE '%' + @Search +'%' OR Departement.NomNL LIKE '%' + @Search +'%' OR Departement.CodeDepartement LIKE '%' + @Search +'%'
    AND ProfilActif = 1	AND (GETDATE() < Profil.DateFin)
     
    UNION					  
    SELECT     Profil.IdProfil, Profil.DateMiseVigueur, Profil.UserIdSibelga AS UserId, Profil.Nom, Profil.Prenom, 
    			           COALESCE(RTRIM(Departement.NomFR) + '/' + RTRIM(Departement.NomNL), RTRIM(Departement.NomFR), RTRIM(Departement.NomNL)) AS Departement, 
    			COALESCE(RTRIM(Service.NomFR) + '/' + RTRIM(Service.NomNL), RTRIM(Service.NomFR), RTRIM(Service.NomNL)) AS Service
    FROM         Profil INNER JOIN
                          ProfilExterne ON Profil.IdProfil = ProfilExterne.IdProfil AND Profil.DateMiseVigueur = ProfilExterne.DateMiseVigueur INNER JOIN
                          Service ON Profil.IdService = Service.IdService INNER JOIN
                          Departement ON Service.IdDepartement = Departement.IdDepartement INNER JOIN
                          LocalisationBatiment ON Profil.IdLocalisationBatiment is NULL OR Profil.IdLocalisationBatiment = LocalisationBatiment.IdLocalisationBatiment
    WHERE Profil.UserIdSibelga LIKE '%' + @Search +'%' OR Profil.Nom LIKE '%' + @Search +'%' OR Profil.Prenom LIKE '%' + @Search +'%' OR Profil.NumTelFixe LIKE '%' + @Search +'%' OR Profil.NumGSM LIKE '%' + @Search +'%' OR Profil.NumFax LIKE '%' + @Search +'%' OR LocalisationBatiment.Nom LIKE '%' + @Search +'%' 
    		OR ProfilExterne.Fonction LIKE '%' + @Search +'%' 
    OR Departement.NomFR LIKE '%' + @Search +'%' OR Departement.NomNL LIKE '%' + @Search +'%' OR Departement.CodeDepartement LIKE '%' + @Search +'%'
    AND ProfilActif = 1 AND (GETDATE() < Profil.DateFin)
    ORDER BY UserIdSibelga
     
    END
    Elle peut paraitre lourde et pourtant elle s'execute assez rapidement.

    Merci d'avance

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 356
    Points : 406
    Points
    406
    Par défaut
    Je pense que si tu as une seule variable pour passer toutes tes recherches sur tout tes champs, tu vas ne pourras pas trop simplifier ton problème. Le mieux serait de pouvoir créer une relation critères de recherches - valeurs.
    De cette manière, tu pourrais construire ta requête de manière dynaique et l'optimiser.
    Mais tout dépend des contraintes que tu as au niveau de ton frontal.

    Plus de détails permettraient de mieux cerner la complexité.
    Bon courage pour la suite.

  3. #3
    Membre confirmé
    Avatar de frechy
    Inscrit en
    Novembre 2004
    Messages
    343
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Novembre 2004
    Messages : 343
    Points : 511
    Points
    511
    Par défaut
    En fait j'ai une page asp avec une textbox.

    Dedans l'utilisateur introduit sa recherche (un ou plusieurs mots).

    Et sur chaque mot je dois rechercher sur plusieurs colonnes de plusieurs tables. Il n'y a pas de critères spécifiques.

    Je ne sais pas si c'est plus clair.

    Que veux-tu dire par "tout dépend des contraintes que tu as au niveau de ton frontal" ?

  4. #4
    Membre confirmé
    Avatar de frechy
    Inscrit en
    Novembre 2004
    Messages
    343
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Novembre 2004
    Messages : 343
    Points : 511
    Points
    511
    Par défaut
    La solution que j'ai trouvé pour l'instant (si pa mieux, je ferai come cela)

    Je construis dynamique en code c# des appels à ma procédure stoquée en retenant les resultats dans des tables temporaires pour finalement faire l'intersect sur ces tables temporaires.


    Voici le genre de code que je pourrais générer automatiquement:

    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
    CREATE TABLE #tmp1(
    [id] int,
    Nom nvarchar(5)
    )
     
    CREATE TABLE #tmp2(
    [id] int,
    Nom nvarchar(5)
    )
     
    INSERT INTO #tmp1
    exec GetBuildingsLocations
     
    INSERT INTO #tmp2
    exec GetBuildingsLocations
     
    SELECT * from #tmp1
    INTERSECT
    SELECT * from #tmp2
     
    DROP TABLE #tmp1
    DROP TABLE #tmp2
    Ceci n'est qu'un exemple, je dois l'adapter à ma procedure de recherche.

    Si quelqu'un trouve mieux, je suis toujours preneur.

Discussions similaires

  1. [CS3] Faire une boucle for sur des champs texte
    Par Bubuk dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 18/12/2013, 17h06
  2. Réponses: 1
    Dernier message: 18/03/2012, 09h59
  3. Réponses: 4
    Dernier message: 28/03/2011, 13h46
  4. Syntaxe pour une boucle for sur des combobox
    Par Tifriis dans le forum VBA Access
    Réponses: 3
    Dernier message: 20/10/2010, 13h52
  5. comment mettre un tableau dans une boucle et sur la meme page
    Par pikkolina dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 24/05/2009, 19h21

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