hardzip
Messages postés6Date d'inscriptionvendredi 1 février 2008StatutMembreDernière intervention11 juin 2009
-
9 juin 2009 à 18:51
nivsql
Messages postés159Date d'inscriptionlundi 22 juin 2009StatutMembreDernière intervention14 décembre 2010
-
24 juin 2009 à 19:22
Bonjour tout le monde
Je suis actuellement entrain de mettre en place un formulaire de recherche avec asp et .NET et j'ai un probleme qui me bloque depuis maintenant 2 jours.
Le principe de ma procedure stockée est la suivante:
elle recupére les données saisies dans les textbox et suivant le champs elle les compare avec des données de la table.
Avec les champs de type "varchar" pas de probleme j'utilise des "LIKE" et ça marche super bien mais concernat les int et autres champs numerique impossible d'y mettre des "LIKE" ce quii fait que les champs numerique doivent OBLIGATOIREMENT etre renseignés pour espérer que la requete nous renvoi un resultat
toute aide serai la bienvenue vu que le travail qui m'est confié est assez urgent.
Ci dessous le code de ma procedure stockée
hardzip
Messages postés6Date d'inscriptionvendredi 1 février 2008StatutMembreDernière intervention11 juin 2009 9 juin 2009 à 19:00
Je precise que j'aimerais effectuer des recherche sans pour autant etre obligé de renseigner tous les champs et quand même avoir des resultats suivant les infos que j'ai fournies
nivsql
Messages postés159Date d'inscriptionlundi 22 juin 2009StatutMembreDernière intervention14 décembre 20101 24 juin 2009 à 18:02
Tu as plusieurs problemes dans cette procédure.
Le premier est que quoi qu'il arrive : Champ = NULL renverra TOUJOURS FAUX ! donc si une seule de tes valeurs numérique n'est pas renseignée ta requete ne retournera AUCUNE données.
Tu dois donc veiller Soit a ce que tes valeurs numériques soient obligatoirement renseignées (ce que tu semble ne pas vouloir d'apres la description de ton probleme).
Tu vas donc devoir changer ton fusil d'epaule et intégrer tous tes parametres en char ou varchar et SURTOUT ne pas les initialiser a null.
Une fois cela fait tu vas devoir abuser de la fonction CAST tel que :
SELECT Prenom_Client, Nom_Client, NumeroTel_Client, CNI_Client, ID_TypeService, ID_Requete, DateCreation, Adresse_Client, ID_Categorie, ID_Type, ID_Statut
FROM Requete
WHERE (Cast(CNI_Client as VARCHAR) Like '%'+@CNI_Client+'%')
AND (Prenom_Client LIKE '%'+@PrenomClient+'%')
AND (Nom_Client LIKE '%'+@NomClient+'%')
AND (Cast(NumeroTel_Client as VARCHAR) like '%'+ @NumTelClient +'%')
AND (Cast(ID_TypeService as VARCHAR) like '%'+@Service+'%')
AND (Cast(ID_Categorie as VARCHAR) like '%'+ @CategorieReq +'%')
AND (Cast(ID_Type as VARCHAR) like '%'+ @TypeReq +'%')
AND (Cast(ID_Statut as VARCHAR) like '%' + @StatutReq +'%')
Je te le dis tout de suite, un dev de chez moi me fait un truc comme ca je le crucifie sur place. Cette methode est TRES SALE et tu a toutes les chances d'écrouler les performances de ta requete sur des volumetrie importante car en utilisant le cast de cette maniere tu empechera le moteur SQL d'utiliser le moindre index.
La maniere propre est de garder tes numérique et de construir ta requete dynamiquement en fonction des champs que tu as en entré.
ta procédure devrais resembler a ca (je suis pas sur a 100% de la synthaxe):
CREATE PROCEDURE [dbo].[psRecherche]
@PrenomClient varchar(60) = '',
@NomClient varchar(60)= '',
@CNI_Client bigint = null,
@Service int = null,
@NumTelClient int = null,
@CategorieReq int = null,
@TypeReq int = null,
@StatutReq int = null
AS
BEGIN
DECLARE dynreq varchar(8000)
SET @dynreq ='SELECT Prenom_Client, Nom_Client, NumeroTel_Client, CNI_Client, ID_TypeService, ID_Requete, DateCreation, Adresse_Client, ID_Categorie, ID_Type, ID_Statut'
SET @dynreq = @dynreq +' FROM Requete WHERE (Prenom_Client LIKE ''%''+@PrenomClient+''%'')AND (Nom_Client LIKE ''%''+@NomClient+''%'')'
IF @CNI_Client IS NOT NULL SET @dynreq @dynreq + ' AND (CNI_Client @CNI_Client)'
IF @NumTelClient IS NOT NULL SET @dynreq @dynreq + ' AND (NumeroTel_Client @NumTelClient)'
IF @Service IS NOT NULL SET @dynreq @dynreq + ' AND (ID_TypeService @Service)'
IF @CategorieReq IS NOT NULL SET @dynreq @dynreq + ' AND (ID_Categorie @CategorieReq)'
IF @TypeReq IS NOT NULL SET @dynreq @dynreq + ' AND (ID_Type @TypeReq)'
IF @StatutReq IS NOT NULL SET @dynreq @dynreq + ' AND (ID_Statut @StatutReq)'
execute(@dynreq)
END
nivsql
Messages postés159Date d'inscriptionlundi 22 juin 2009StatutMembreDernière intervention14 décembre 20101 24 juin 2009 à 19:22
Voila un exemple de la solution propre qui marche sur la base exemple de microsoft, adventureWorks :
PROCEDURE [dbo].[psRecherche]
@PrenomClient as varchar(60),
@NomClient as varchar(60),
@CNI_Client as bigint
AS
DECLARE @dynreq varchar(8000)
BEGIN
SET @dynreq ='SELECT *'
SET @dynreq = @dynreq +' FROM Person.Contact WHERE (FirstName LIKE ''%''+'''+@PrenomClient+'''+''%'')AND (LastName LIKE ''%''+'''+@NomClient+'''+''%'')'
IF @CNI_Client IS NOT NULL SET @dynreq @dynreq + ' AND (ContactID '+cast(@CNI_Client as varchar)+')'
PRINT @dynreq
execute(@dynreq)
END