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 :

Requete SQL dans boucle while


Sujet :

MS SQL Server

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 49
    Par défaut Requete SQL dans boucle while
    Voila, petit probleme sur SQLServer (pas forcément spécifique )

    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
     
    Declare @nbMot int,
            @WhereClause  VARCHAR(200),
            @Mot VARCHAR(25)
    Set @nbMot = 2  -- renseigne par parametre transmis
     
     
    while(@nbMot != 0)
    begin
      Set @Mot = 'toto'  -- renseigne par parametre transmis
      --print @nbMot
      AND Description_demande LIKE '%'+@Mot+'%' AND Description_travaux like '%'+@Mot+'%'
      Set @nbMot = @nbMot - 1
     
    end
    L'interet est d'excuter une requete SQL a l'interieur d'une boucle while
    Mais cela ne marche pas alors que :
    si je mets la requete à l'exterieur de la boucle la ca va

    Donc voila je ne maitrise pas SQLServer donc je voudrais avoir votre avis ...

  2. #2
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Par défaut
    Mais où est la requête en question ?
    Je la vois pas.

    Découvrez la FAQ de MS SQL Server.
    La chance accorde ses faveurs aux esprits avertis !

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 49
    Par défaut
    Citation Envoyé par WOLO Laurent
    Mais où est la requête en question ?
    Je la vois pas.

    Desole, bon voila la requete au complet :

    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
    SELECT *
    FROM Demande_Travaux DT
    WHERE 
    Auteur = COALESCE(param1,Auteur)
    
    Declare @nbMot int,
            @WhereClause  VARCHAR(200),
            @Mot VARCHAR(25)
    Set @nbMot = param2  -- renseigne par les parametres transmis
    
    
    while(@nbMot != 0)
    begin
      Set @Mot = 'toto' -- renseigne par les parametres transmis
      --print @nbMot
      AND Description_demande LIKE '%'+@Mot+'%' AND Description_travaux like '%'+@Mot+'%'
      Set @nbMot = @nbMot - 1
    
    end

  4. #4
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Par défaut
    Declare @nbMot int,
    @WhereClause VARCHAR(200),
    @Mot VARCHAR(25)
    Set @nbMot = param2 -- renseigne par les parametres transmis


    while(@nbMot != 0)
    begin
    Set @Mot = 'toto' -- renseigne par les parametres transmis
    --print @nbMot
    SELECT *
    FROM Demande_Travaux DT
    WHERE
    Auteur = COALESCE(param1,Auteur)
    AND Description_demande LIKE '%'+@Mot+'%' AND Description_travaux like '%'+@Mot+'%'

    Set @nbMot = @nbMot - 1

    end
    Quel est l'interêt pour toi de lancer la même deux fois ?

    Découvrez la FAQ de MS SQL Server.
    La chance accorde ses faveurs aux esprits avertis !

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 49
    Par défaut
    Le problème est qu'ici, la requete SELECT va etre effectué plusieurs fois (autant de fois que de mot).
    Alors que moi je souhaite juste répeter la clause
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    AND Description_demande LIKE '%'+@Mot+'%' AND Description_travaux like '%'+@Mot+'%'
    autant de fois qu'il ya de mot, ainsi j'aurai par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT *
    FROM Demande_Travaux DT
    WHERE 
    Auteur = COALESCE(null,Auteur)
    AND Description_demande LIKE '%'+'mot1'+'%' AND Description_travaux like '%'+'mot1+'%'
    AND Description_demande LIKE '%'+'mot2'+'%' AND Description_travaux like '%'+'mot2'+'%'
    Dans le cas, ou je passe deux mots en parametre de ma requete : mot1 et mot2

    Je sais pas si c'est plus clair....

  6. #6
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Par défaut
    SQL Dynamique oblige....
    C'est pas performant mais c'est le prix à payer.

    Declare @nbMot int,
    @WhereClause VARCHAR(200),
    @Mot VARCHAR(25),
    @sql varchar(8000)

    Set @nbMot = param2 -- renseigne par les parametres transmis

    --On affecte le template
    set @sql='SELECT * FROM Demande_Travaux DT WHERE
    Auteur = COALESCE(param1,Auteur) '

    --Lancement de la boucle :
    while(@nbMot != 0)
    begin
    Set @Mot = 'toto' -- renseigne par les parametres transmis
    --print @nbMot
    set @sql=@sql + '
    AND Description_demande LIKE %' + @Mot + cast(@nbMot as varchar(2)) + '% AND Description_travaux like %' + @Mot + cast(@nbMot as varchar(2)) + %'

    Set @nbMot = @nbMot - 1

    end

    print @sql
    Exec @sql

    Découvrez la FAQ de MS SQL Server.
    La chance accorde ses faveurs aux esprits avertis !

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 49
    Par défaut
    Voici la reponse sur un exemple avec 1 mot "ma" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT * FROM Demande_Travaux DT WHERE
    Auteur = COALESCE(null,Auteur) 
    AND Description_demande LIKE %ma% AND Description_travaux like %ma%
    Msg 203, Niveau 16, État 2, Ligne 24
    Le nom 'SELECT * FROM Demande_Travaux DT WHERE
    Auteur = COALESCE(null,Auteur) 
    AND Description_demande LIKE %ma% AND Description_travaux like %ma%' n'est pas un identificateur correct.
    Le probleme est que je ne gère pas le SGBD. Je sais qu'il n'a pas la possibilité d'utiliser des trigger sur la base de données.
    donc je pense que SQl dynamique risque d'etre difficile dans ce cas.

    Mais cet erreur ne vient pas du fait qu'il manque une ' avant et apres les % ?
    Comment est-il possible d'afficher une ' dans un texte ? '\' ?

    Merci de votre interet sur le sujet

  8. #8
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Par défaut
    set @sql=@sql + '
    AND Description_demande LIKE ''%' + @Mot + cast(@nbMot as varchar(2)) + '%''
    AND Description_travaux like ''%' + @Mot + cast(@nbMot as varchar(2)) + '' + '%'''

    Découvrez la FAQ de MS SQL Server.
    La chance accorde ses faveurs aux esprits avertis !

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 49
    Par défaut
    Idem !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT * FROM Demande_Travaux DT WHERE
    Auteur = COALESCE(null,Auteur) 
    AND Description_demande LIKE '%ma%' AND Description_travaux like '%ma%' 
    Msg 203, Niveau 16, État 2, Ligne 24
    Le nom 'SELECT * FROM Demande_Travaux DT WHERE
    Auteur = COALESCE(null,Auteur) 
    AND Description_demande LIKE '%ma%' AND Description_travaux like '%ma%' ' n'est pas un identificateur correct.
    Pourquoi voit-il la requete comme un nom ? Peut-etre ne faudrait-t-il pas la definir en VARCHAR ?
    Le EXEC accepte-t-il une donné de type VARCHAR

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 49
    Par défaut
    Ca yé c'est bon, finalement il manquait des parenthèses

    En tout cas merci bien....
    Faut encore que je complete cette requete pour faire un systeme de mot clé sur demande ...

    Allez bonne journée

  11. #11
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Par défaut
    Mais il manque le tague résolu.

    Découvrez la FAQ de MS SQL Server.
    La chance accorde ses faveurs aux esprits avertis !

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 49
    Par défaut
    Citation Envoyé par WOLO Laurent
    Mais il manque le tague résolu.

    C'est vrai mais en fait je voulais etre sur que mon pb est résolu ...
    Il s'avère que tant d'effort pour rien car je ne pourrais pas l'utiliser, trop compliqué!
    J'explique brievement :
    Cette requete Sql crée et lu à partir d'un serveur java jusqu'à la ca va ...

    J'utilise les classes Java pour recuperer ma requete. Query query = PrepareStament(string sql)

    Et ensuite je passe mes parametres à la requete.
    Query.set(int 1).
    Donc le ? voulu prend la valeur de 1.

    Mais seulement voila, avec la methode set @sql = 'ma requete'
    Tout les ? qui sont dans la requete du depart : set @sql = 'SELECT FROM table where id=?' : ce ? n'est pas vu.

    Donc voila ...

  13. #13
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Par défaut
    Il te faut penser procedure stockées dans ces conditions là.

    Découvrez la FAQ de MS SQL Server.
    La chance accorde ses faveurs aux esprits avertis !

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 49
    Par défaut
    Citation Envoyé par WOLO Laurent
    Il te faut penser procedure stockées dans ces conditions là.
    J'ai suivie le conseil :

    Ma procedure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CREATE Procedure Filtre_motsCles
         @Mot varchar(20)
    AS
    SELECT Numero,DateHeure_prisecompte,Type_demande,Etat,Auteur,DateHeure_saisie,Vise
    FROM Demande_Travaux DT
    WHERE Description_demande LIKE '%' + @Mot + '%' OR Description_travaux LIKE '%' + @Mot  + '%'
    Ma requete appele :
    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
     
    DECLARE @nbMot int,
    	@Mot VARCHAR(25)
     
     
    --On affecte le template
    SELECT Numero,DateHeure_prisecompte,Type_demande,Etat,Auteur,DateHeure_saisie,Vise
    FROM Demande_Travaux DT
    WHERE 
     
    Auteur = COALESCE(null,Auteur)
     
     
    -- Gere les mots cles
    Set @nbMot = COALESCE(1,0) -- renseigne par les parametres transmis
     
    if(@nbMot !=0)  -- filtre sur mot cle
    BEGIN
    	--Lancement de la boucle :
    	WHILE(@nbMot !=0)
    		BEGIN
    		EXECUTE Filtre_motsCles 'num0'
    		set @nbMot = @nbMot -1;
    		END
    END
    Bon voila ca ca marche mais il reste que j'ai recupere deux selections. N'est-il pas possible de faire l'intersection des deux ?
    Mais je pense que mon probleme restera le meme car il faut que je mette autant de ? que de parametre qui vont etre passe, donc cela risque de poser probleme si je ne veux pas faire passer de mot car la requete va attendre 2 ?.

    je crois que ca devient trop compliqué !!

  15. #15
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 434
    Par défaut
    C'est pas compliqué à faire, mais je crois que tu as deux soucis :

    1- D'où viennent ces "?" sortis de nulle part au milieu de ton poste. Je ne comprends pas le problème...
    2- il faut que la procédure stockée que tu appelles te renvoie la requête SQL à lancer ensuite.

    Donc deux étapes :

    1- Tu appeles la proc avec le nombres de mots pour faire ton ordre SQL (regarde le code de WOLO Laurent auquel tu vires le exec à la fin, mais tu rajoutes un paramétre @SQLTOEXEC de type OUTPUT à la fin
    2- Ton code JAVA execute @SQLEXEC

    Courage

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 49
    Par défaut
    Citation Envoyé par ZERS
    C'est pas compliqué à faire, mais je crois que tu as deux soucis :

    1- D'où viennent ces "?" sortis de nulle part au milieu de ton poste. Je ne comprends pas le problème...
    2- il faut que la procédure stockée que tu appelles te renvoie la requête SQL à lancer ensuite.

    Donc deux étapes :

    1- Tu appeles la proc avec le nombres de mots pour faire ton ordre SQL (regarde le code de WOLO Laurent auquel tu vires le exec à la fin, mais tu rajoutes un paramétre @SQLTOEXEC de type OUTPUT à la fin
    2- Ton code JAVA execute @SQLEXEC

    Courage

    1 - les ? sont des elements ecrits dans la requete sql qui seront remplace par des valeurs quand je fais passer des parametres avec une methode de Java (JDBC)

    Quel type de données doit etre le resultat de la procedure stockée ? Autre que varchar(2000) . Car si je veux faire un intersect avec ma premiere requete et ensuite sur chaque requete renvoyé par la procedure stockée.

    2 - En Java : ce qui est fait est qu'il lit la requete sql , compte le nb de ? , puis attend que j'affecte les parametres à la requete autant que de ?. Et enfin , si le nb de paramatres passes est correct alors je peux executer la requete.

    Donc oui ce n'est pas si simple, le passage de parametres ne rend pas la chose facile ! ...

  17. #17
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 434
    Par défaut
    Plus je lis ton post, moins je comprends ce que tu souhaites...

    Reprenons :

    Tu veux appeler, via du code JAVA, un procédure stockée qui va te sortir le résultat d'une requête dont le nombre de filtres (clause WHERE ou AND) n'est suivant le nombre de mots à rechercher, ces mots étant passés en paramètre dans la procédure stockée

    J'ai bon ?

    Si j'ai bien compris ton soucis (à confirmer), voici ce que je te propose (je connais pas JAVA mais bon, c'est du classique) :

    1- TU crées une seule procédure stockée avec 1 seul paramètre : une cahine de caractères qui contient la liste des mots à rechercher
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CREATE PROCEDURE sp_ListeRecherche (@pLISTEMOT nvarchar(4000))
    BEGIN
    ...
    END
    2- Tu décides par toi même que les mots, dans la chaine de caractère passée en paramétre de la proc stockée, seront séparés (par exemple) par des virgules.

    Donc ton code JAVA va appeler la proc comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exec  sp_listeRecherche 'mot1,mot2, mot3'
    3- Dans le corps de ta procédure stockée, tu fais une boucle sur le paramètre @sp_ListeRecherche et à chaque fois que tu trouves une virgule (utilise CHARINDEX), tu ajoutes un nouveau filtre à une chaine SQL dynamique.

    4- Puis toujours dans la proc, tu exécutes la chaine dynqmiquement créée et tu récupères son résultat dans ton code JAVA

    Jette un coup d'oeil attentif à ce post :
    http://www.developpez.net/forums/sho...d.php?t=186225

    et notamment le code SQL que j'ai mis dans le fichier attaché.

    Je suis sur que ca va résoudre ton soucis

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 49
    Par défaut
    bon ca progresse ...
    Ce que tu me donnes va m'aider pour le passage de parametres des mots mais mon probleme reste le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    DEclare 
        @nbMot int
     
     
    SELECT * 
    FROM Ma_Table
    WHERE id=..
     
    if(nbMot !=0)
        Exec(ma_procedure_stockée(ListeMots))
    Jusque la ca va...
    Mais maintenant ma procedure stockée fait un select sur cette meme table, et je voudrais que la requete toute entiere ne me renvoie pas deux selects (la 1er + celle de la procedure stockée) MAIS l'intersection des deux.

    En clair faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    (SELECT * 
    FROM Ma_Table
    WHERE id=..
    )
    INTERSECT
    (
    if(nbMot !=0)
        Exec(ma_procedure_stockée(ListeMots))
    )
    Mais biensur ca ne marche pas ....
    Pourquoi ? je ne sais pas comment ...

  19. #19
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 434
    Par défaut
    désolé j'abandonne....
    D'une part parce que je pars en vacances, mais aussi parce que décidément, je ne comprends pas ce que tu veux.
    Tu n'as pas répondu à ma question de savoir si j'vais compris ton besoin.
    Le fait que tu souhaites absolument tester le nb de mot me laisse croire que j'ai rien compris à ton besoin.

    Bon courage

Discussions similaires

  1. Réponses: 13
    Dernier message: 23/09/2011, 18h24
  2. [ODBC] ODBC Access+ requete insert dans boucle while
    Par gpaca dans le forum PHP & Base de données
    Réponses: 0
    Dernier message: 17/03/2010, 16h41
  3. [MySQL] Requetes SQL dans une boucle PHP
    Par Siteac dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 12/11/2006, 14h35
  4. Recuperer un enregistrement de requete SQL dans une variable
    Par kleenex dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 14/09/2005, 15h59
  5. résultat d'une requete SQL dans un tableau en JSP
    Par Paradoxys dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 06/04/2005, 16h17

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