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 :

Probleme avec Like et une variable


Sujet :

Développement SQL Server

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Septembre 2002
    Messages : 148
    Points : 70
    Points
    70
    Par défaut Probleme avec Like et une variable
    Bonjour,
    J'ai cette requete qui ne trouve aucun resultat, alors que je sais qu'elle existe la reponse car si je l'essaye sans variable je trouve mes ecritures , et si je remplace les valeurs par des variables , la requete ne retourne rien. Pouvez vous me dire ou je me suis trompé :
    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
    declare @Montant as float
    declare @Libelle as varchar(20)
    declare @Libelle2 as varchar(20)
     
    set @Montant = '3538.36'
    set @Libelle = 'VIR'
     
    select @libelle2 = +'%' +@libelle +'%';
    select
    	t1.[Cust_ Ledger Entry No_] as sequence,
    	T3.[Document No_],
     
    	case
    		when (T3.[N° Affaire]) = '' then T3.[No Affaire]
    		end as Affaire,
     
    	convert(char(10),T1.[Posting Date],103) as Date,
    	t1.[Initial Entry Global Dim_ 1] as Agence,
    	t1.[Customer No_] as Num_Client,
    	t2.[Name] as Noms_Client,
    	cast(t1.Amount as decimal(18,2)) as Montant_TTC
    from dbo.[societe$Detailed Cust_ Ledg_ Entry] t1
    	inner join dbo.[societe$Customer] t2
    	on t2.No_ = t1.[Customer No_] 
    		inner join dbo.[societe$Cust_ Ledger Entry] T3
    		on T3.[Entry No_] = t1.[Cust_ Ledger Entry No_]
    			where t1.Amount like @Montant
    			and t2.[Name] like @Libelle2
    order by T1.[Posting Date] desc
    MERCI

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    première chose, les type numériques se passent de quote :
    écrivez plutot SET @Montant = 3538.36deuxième chose, sur le plan théorique, @libele2 devrait etre un VARCHAR(22), afin de pouvoir contenir les deux "%" dans le cas où @Libelle ferait 20 caractéres...

    Mais ces deux points ne devraient toutefois pas poser de problème ici, puisque pour le premier, il y a un transtypage implicite, et pour le second, "VIR" ne fait que trois lettres...

    Et à vrai dire, je ne vois pas d'où peut provenir votre problème

    pouvez vous nous montrer également votre requête "sans variables" ?
    et éventuellement le résultat qu'elle fournit (au moins quelques lignes...)

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Septembre 2002
    Messages : 148
    Points : 70
    Points
    70
    Par défaut
    Bonjour aieeuuuuu,
    Moi non plus je n'arrive pas a comprendre ce qui bloque. Voici la requete sans les variables :

    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
    select
    				t1.[Cust_ Ledger Entry No_] as sequence,
    				T3.[Document No_],
     
    				case
    				when (T3.[N° Affaire]) = '' then T3.[No de Commande Affaire]
    				end as Affaire,
     
    				convert(char(10),T1.[Posting Date],103) as Date,
    				t1.[Initial Entry Global Dim_ 1] as Agence,
    				t1.[Customer No_] as Num_Client,
    				t2.[Name] as Noms_Client,
    				cast(t1.Amount as decimal(18,2)) as Montant_Ouvert_TTC
    			from dbo.[FONDASOL$Detailed Cust_ Ledg_ Entry] t1
    				inner join dbo.[FONDASOL$Customer] t2
    					on t2.No_ = t1.[Customer No_] 
    						inner join dbo.[FONDASOL$Cust_ Ledger Entry] T3
    							on T3.[Entry No_] = t1.[Cust_ Ledger Entry No_]
    			where t1.Amount like '%3235.36%'
    			and t2.[Name] like '%vir%'
    order by T1.[Posting Date] desc

    Voici la ligne de resultat :
    sequence Document No_ Affaire Date Agence Num_Client Noms_Client Montant_Ouvert_TTC
    38 177807 11.0123 27/06/2011 IPE C00731 BRIOCHE CHATELET 3538.36

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour

    Dans votre code avec variables, vous ecrivez VIR en majuscules, dans votre code sans variable, vous l'ecrivez en minuscules... quel est le type t surtout la collation de la colonne t2.[Name] ?

    D'autre part, dans votre code avec variable, je ne vois pas où vous ajoutez les "%" à votre variable @Montant mais surtout je m'interroge : quel est le type de la colonne t1.Amount et pourquoi faire un like '%%' alors que logiquement, cela semble être un nombre...

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Septembre 2002
    Messages : 148
    Points : 70
    Points
    70
    Par défaut
    il s'agit effectivement d'un nombre , j'ai mis % pour si le champ est non renseigné qu'il affiche bien les données avec la deuxieme variable sinon si je ne renseigne pas ce champ il m'indique une erreur.
    Pour les majuscule et minuscule il n'y a pas de soucis il ne tiens pas compte de la casse.

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par backdraf Voir le message
    il s'agit effectivement d'un nombre
    Quel est le type de la colonne ?
    est-elle nullable ?

    , j'ai mis % pour si le champ est non renseigné qu'il affiche bien les données avec la deuxième variable sinon si je ne renseigne pas ce champ il m'indique une erreur.
    je ne comprend pas très bien, un petit exemple serait le bienvenu ! et je ne vois toujours pas l’intérêt des % !!!

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Septembre 2002
    Messages : 148
    Points : 70
    Points
    70
    Par défaut
    Alors proprietes de mon champ "amount" de ma table
    Amount(decimal(38,20), non NULL)

    Si j'utilise la requete ci jointe :
    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
    select
    	t1.[Cust_ Ledger Entry No_] as sequence,
    	T3.[Document No_],
     
    	case
    	when (T3.[N° Affaire]) = '' then T3.[No de Commande Affaire]
    	end as Affaire,
     
    	convert(char(10),T1.[Posting Date],103) as Date,
    	t1.[Initial Entry Global Dim_ 1] as Agence,
    	t1.[Customer No_] as Num_Client,
    	t2.[Name] as Noms_Client,
    	t1.Amount as Montant_Ouvert_TTC
    from dbo.[societe$Detailed Cust_ Ledg_ Entry] t1
    		inner join dbo.[societe$Customer] t2
    		on t2.No_ = t1.[Customer No_] 
    			inner join dbo.[societe$Cust_ Ledger Entry] T3
    			on T3.[Entry No_] = t1.[Cust_ Ledger Entry No_]
    where t1.Amount = 3538.36
    	and t2.[Name] like '%VIR%'
    order by T1.[Posting Date] desc
    J'ai comme resultat voir la piece jointe)

    Comment dois je faire pour obtenir le meme resultat en modifiant :
    3538.36 en variable @Montant
    et
    VIR en variable @Libelle

    Et qui plus est en donnant la possibilite de ne renseigner qu'une partie de la variable comme :
    "353%" => @Montant au lieu de "3538.36"
    "%VIR%" => @Libelle au lieu de "VIR CHATELET"

    J'espere etre clair
    MERCI
    Fichiers attachés Fichiers attachés

  8. #8
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Amount(decimal(38,20), non NULL)
    Alors pourquoi déclarer @Montant en float ?

    en utilisant un like derrière, c'est ce qui provoque votre problème !

    Vous pouvez déjà faire comme ceci pour la colonne [name]
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    AND t2.[Name] LIKE '%' + VIR%' + @Libelle + '%'

    Sachez cependant que ce type de prédicate est couteux, car le moteur ne peut pas utiliser les index.

    pour ce qui est du montant, j'ai du mal a comprendre l'interet de ce type de recherche. Avec votre exemple ('353%'), cela sortira :
    1/ 3538.36 --> ce que vous voulez
    mais aussi :
    2/ 353
    3/ 353.456
    4/ 3532268
    5/...

    Est-ce vraiment ce que vous voulez ?
    Dans ce cas vous pouvez transtyper votre decimal (Amount) en varchar puis comparer avec un LIKE, mais la encore, ce sera couteux, pour les mêmes raisons !

    Une recherche sur la partie entière par exemple pourrait être bien plus performante !

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Septembre 2002
    Messages : 148
    Points : 70
    Points
    70
    Par défaut
    merci pour votre aide.
    L'interet de cette recherche c'est de trouver dans une colonne de nombres , les nombres qui contiennent la partie qui est defini dans notre variable.

    Comme vous l'avez bien resumé dans votre tableau avec la partie "353" qui peut se trouver en debut ou en fin ou au milieu d'un nombre.

  10. #10
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    également en milieu ou en fin d'un nombre ?!?


    alors effectivement je ne vois pas d'autre solution que de déclarer @Montant en varchar(41), et de faire :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    WHERE 
    	CAST(t1.Amount AS VARCHAR(41)) LIKE '%' + @Montant + '%'
    	AND t2.[Name] LIKE '%' + @Libelle + '%'

    Mais... c'est moche

Discussions similaires

  1. Réponses: 3
    Dernier message: 28/08/2009, 11h06
  2. [C#] c# - mysql avec LIKE et une variable
    Par korben06 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 12/06/2006, 23h39
  3. [Debutant] Probleme d'acces a une variable
    Par Bugmaster dans le forum Langage
    Réponses: 16
    Dernier message: 02/09/2004, 15h57
  4. Réponses: 3
    Dernier message: 26/01/2004, 17h59
  5. Réponses: 13
    Dernier message: 14/06/2003, 22h15

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