Requete SQL

Résolu/Fermé
soleil_levant Messages postés 393 Date d'inscription lundi 15 septembre 2008 Statut Membre Dernière intervention 14 avril 2011 - 13 août 2009 à 14:01
soleil_levant Messages postés 393 Date d'inscription lundi 15 septembre 2008 Statut Membre Dernière intervention 14 avril 2011 - 13 août 2009 à 16:23
Bonjour

Je souhaite utiliser ma procédure stockée SQL Server qui renvoie un résultat requete. les paramètres sont @nom, @prenom et @datenaissance. ils sont tous obligatoires (closes AND)
je souhaite renseigner dans un cas le nom, la date de naissance et pas le prénom, qu'elle paramètre dois-je mettre?
J'ai essayé EXEC 'Nom de ma proc' @Nom = 'DUPONT', @Prenom = '*', @Date = '09021984'
le résultat est vide.

Quelqu'un a une idée??
Merci beaucoup.

4 réponses

Christounet Messages postés 1264 Date d'inscription mercredi 26 septembre 2007 Statut Membre Dernière intervention 29 juillet 2010 1 389
13 août 2009 à 15:09
Bonjour soleil_levant,

Peux-tu copier/coller le code de ta procédure stp? Cela devrait me permettre d'essayer de t'aider.

A plus
0
soleil_levant Messages postés 393 Date d'inscription lundi 15 septembre 2008 Statut Membre Dernière intervention 14 avril 2011 32
13 août 2009 à 15:51
Re-Christounet,
J'ai trouvé pour le contain :
@Nom_Client LIKE '%'+prametr+'%'
@Prenom_Client LIKE '%'+parametre+'%'

Mais pr la date pas encore ;)

Merci
0
soleil_levant Messages postés 393 Date d'inscription lundi 15 septembre 2008 Statut Membre Dernière intervention 14 avril 2011 32
13 août 2009 à 15:30
Bonjour Christounet,
Merci pour ta réponse :)
Voici mon code avec les commentaires inclut :

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO

--ICI c'est Alter, ne pas oublier de créer la proc si elle existe pas
ALTER PROCEDURE [dbo].[zzzz_selection_client]
(@Prenom_Client varchar(100), @Nom_Client varchar(100))
WITH
EXECUTE AS CALLER
AS
SELECT SendPayIndicator As [Code TYPE], S_SEN_FIRSTNAME As [Prénom du Client], S_SEN_LASTNAME As [Nom du Client], S_SEN_BIRTHDATE As [Date de Naissance Client], S_SEN_ADDRESS As [Adresse du Client], S_SEN_CITY As [Ville du Client], S_SEN_ZIP As [Code Postal], S_REC_FIRSTNAME As [Prénom Client Autre], S_REC_LASTNAME As [Nom Client Autre]
FROM qryTransactionDetails
WHERE qryTransactionDetails.SendPayIndicator = 'S'
AND qryTransactionDetails.S_SEN_LASTNAME = @Nom_Client /* Ici je veux que ça soit un contient la valeur du paramètre */
AND qryTransactionDetails.S_SEN_FIRSTNAME = @Prenom_Client /*contain la valeur du parametre*/
AND qryTransactionDetails.S_SEN_BIRTHDATE = @Date_Naissance
UNION ALL
SELECT SendPayIndicator, P_REC_FIRSTNAME, P_REC_LASTNAME, P_REC_BIRTHDATE, P_REC_ADDRESS, P_REC_CITY, P_REC_ZIP, P_SEN_FIRSTNAME, P_SEN_LASTNAME
FROM qryTransactionDetails
WHERE qryTransactionDetails.SendPayIndicator = 'P'
AND qryTransactionDetails.P_REC_LASTNAME = @Nom_Client /* contain aussi*/
AND qryTransactionDetails.P_REC_FIRSTNAME = @Prenom_Client /*contain aussi*/
AND qryTransactionDetails.P_REC_BIRTHDATE = @Date_Naissance


Tu remarquera niveau date de naissance, une égalité absolut. Il se peu que je ne possède pas la date de naissance, je peux mettre un bloc avec des AND et un autre OR, mais ça risque de ralentir la requete :(
ex WHERE ((nom and prenom and date)OR(nom and prenom)) <== risque de reparcourir les lignes

Merci d'avance Chrsitounet
0
Christounet Messages postés 1264 Date d'inscription mercredi 26 septembre 2007 Statut Membre Dernière intervention 29 juillet 2010 1 389
13 août 2009 à 16:04
Bonjour soleil_levant,


Tu peux rajouter dans ta procédure des tests sur les paramètres, le code donnant ceci
IF @Prenom_Client <> '*' AND @Date_Naissance <> 0
BEGIN
SELECT SendPayIndicator As [Code TYPE], S_SEN_FIRSTNAME As [Prénom du Client], S_SEN_LASTNAME As [Nom du Client], S_SEN_BIRTHDATE As [Date de Naissance Client], S_SEN_ADDRESS As [Adresse du Client], S_SEN_CITY As [Ville du Client], S_SEN_ZIP As [Code Postal], S_REC_FIRSTNAME As [Prénom Client Autre], S_REC_LASTNAME As [Nom Client Autre]
FROM qryTransactionDetails
WHERE qryTransactionDetails.SendPayIndicator = 'S'
AND qryTransactionDetails.S_SEN_LASTNAME = @Nom_Client /* Ici je veux que ça soit un contient la valeur du paramètre */
AND qryTransactionDetails.S_SEN_FIRSTNAME = @Prenom_Client /*contain la valeur du parametre*/
AND qryTransactionDetails.S_SEN_BIRTHDATE = @Date_Naissance
UNION ALL
SELECT SendPayIndicator, P_REC_FIRSTNAME, P_REC_LASTNAME, P_REC_BIRTHDATE, P_REC_ADDRESS, P_REC_CITY, P_REC_ZIP, P_SEN_FIRSTNAME, P_SEN_LASTNAME
FROM qryTransactionDetails
WHERE qryTransactionDetails.SendPayIndicator = 'P'
AND qryTransactionDetails.P_REC_LASTNAME = @Nom_Client /* contain aussi*/
AND qryTransactionDetails.P_REC_FIRSTNAME = @Prenom_Client /*contain aussi*/
AND qryTransactionDetails.P_REC_BIRTHDATE = @Date_Naissance
end
else
IF @Prenom_Client = '*' AND @Date_Naissance <> 0
BEGIN
SELECT SendPayIndicator As [Code TYPE], S_SEN_FIRSTNAME As [Prénom du Client], S_SEN_LASTNAME As [Nom du Client], S_SEN_BIRTHDATE As [Date de Naissance Client], S_SEN_ADDRESS As [Adresse du Client], S_SEN_CITY As [Ville du Client], S_SEN_ZIP As [Code Postal], S_REC_FIRSTNAME As [Prénom Client Autre], S_REC_LASTNAME As [Nom Client Autre]
FROM qryTransactionDetails
WHERE qryTransactionDetails.SendPayIndicator = 'S'
AND qryTransactionDetails.S_SEN_LASTNAME = @Nom_Client /* Ici je veux que ça soit un contient la valeur du paramètre */
AND qryTransactionDetails.S_SEN_BIRTHDATE = @Date_Naissance
UNION ALL
SELECT SendPayIndicator, P_REC_FIRSTNAME, P_REC_LASTNAME, P_REC_BIRTHDATE, P_REC_ADDRESS, P_REC_CITY, P_REC_ZIP, P_SEN_FIRSTNAME, P_SEN_LASTNAME
FROM qryTransactionDetails
WHERE qryTransactionDetails.SendPayIndicator = 'P'
AND qryTransactionDetails.P_REC_LASTNAME = @Nom_Client /* contain aussi*/
AND qryTransactionDetails.P_REC_BIRTHDATE = @Date_Naissance
end
else
IF @Prenom_client <> '*' AND @Date_Naissance = 0
begin
SELECT SendPayIndicator As [Code TYPE], S_SEN_FIRSTNAME As [Prénom du Client], S_SEN_LASTNAME As [Nom du Client], S_SEN_BIRTHDATE As [Date de Naissance Client], S_SEN_ADDRESS As [Adresse du Client], S_SEN_CITY As [Ville du Client], S_SEN_ZIP As [Code Postal], S_REC_FIRSTNAME As [Prénom Client Autre], S_REC_LASTNAME As [Nom Client Autre]
FROM qryTransactionDetails
WHERE qryTransactionDetails.SendPayIndicator = 'S'
AND qryTransactionDetails.S_SEN_LASTNAME = @Nom_Client /* Ici je veux que ça soit un contient la valeur du paramètre */
AND qryTransactionDetails.S_SEN_FIRSTNAME = @Prenom_Client /*contain la valeur du parametre*/
UNION ALL
SELECT SendPayIndicator, P_REC_FIRSTNAME, P_REC_LASTNAME, P_REC_BIRTHDATE, P_REC_ADDRESS, P_REC_CITY, P_REC_ZIP, P_SEN_FIRSTNAME, P_SEN_LASTNAME
FROM qryTransactionDetails
WHERE qryTransactionDetails.SendPayIndicator = 'P'
AND qryTransactionDetails.P_REC_LASTNAME = @Nom_Client /* contain aussi*/
AND qryTransactionDetails.P_REC_FIRSTNAME = @Prenom_Client /*contain aussi*/
end
else
SELECT SendPayIndicator As [Code TYPE], S_SEN_FIRSTNAME As [Prénom du Client], S_SEN_LASTNAME As [Nom du Client], S_SEN_BIRTHDATE As [Date de Naissance Client], S_SEN_ADDRESS As [Adresse du Client], S_SEN_CITY As [Ville du Client], S_SEN_ZIP As [Code Postal], S_REC_FIRSTNAME As [Prénom Client Autre], S_REC_LASTNAME As [Nom Client Autre]
FROM qryTransactionDetails
WHERE qryTransactionDetails.SendPayIndicator = 'S'
AND qryTransactionDetails.S_SEN_LASTNAME = @Nom_Client /* Ici je veux que ça soit un contient la valeur du paramètre */
UNION ALL
SELECT SendPayIndicator, P_REC_FIRSTNAME, P_REC_LASTNAME, P_REC_BIRTHDATE, P_REC_ADDRESS, P_REC_CITY, P_REC_ZIP, P_SEN_FIRSTNAME, P_SEN_LASTNAME
FROM qryTransactionDetails
WHERE qryTransactionDetails.SendPayIndicator = 'P'
AND qryTransactionDetails.P_REC_LASTNAME = @Nom_Client /* contain aussi*/
end

Alors je suis parti du principe que tu auras toujours Nom_Client connu, et j'ai envisagé les quatre cas suivants:
1°) Prenom_Client connu (<> '*') et Date_Naissance connue (<> 0)
2°) Prenom_Client non-connu (= '*') et Date_Naissance connue (<> 0)
3°) Prenom_Client connu (<> '*') et Date_Naissance non-connue (= 0)
4°) Prenom_Client non-connu (= '*') et Date_Naissance non-connue (=0)
et j'ai donc quatre select différents en fonction de ces cas.
Si tu ne connais pas le prénom, passe comme paramètre *, si tu ne connais pas la date de naissance passe comme paramètre 0.
J'ai pas testé le code, à toi de voir.
A plus
0
soleil_levant Messages postés 393 Date d'inscription lundi 15 septembre 2008 Statut Membre Dernière intervention 14 avril 2011 32
13 août 2009 à 16:23
Merci pour ta réponse Christounet,
C'est super comme solution, les tables de ma bases ne sont pas toutes indexées ou plutot mal indexées. Comme tu m'as déja conseillé sur autre post d'indexer selon mon besoin, ta solution risque de mettre d'avantages de contraintes sur le temps d'execution de ma proc. La date de naissance est finalement obligatoire me dit-on, alors je préserver cette structure de ma proc en ajoutant le LIKE '%'+..+'%'

Merci encore une fois,

Sujet Résolut grâce à l'unique Christounet :D
0