Requete SQL

Résolu
soleil_levant Messages postés 426 Statut Membre -  
soleil_levant Messages postés 426 Statut Membre -
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.
Configuration: Windows XP
Firefox 3.0.3

4 réponses

  1. Christounet Messages postés 1272 Date d'inscription   Statut Membre Dernière intervention   1 393
     
    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
    1. soleil_levant Messages postés 426 Statut Membre 32
       
      Re-Christounet,
      J'ai trouvé pour le contain :
      @Nom_Client LIKE '%'+prametr+'%'
      @Prenom_Client LIKE '%'+parametre+'%'

      Mais pr la date pas encore ;)

      Merci
      0
  2. soleil_levant Messages postés 426 Statut Membre 32
     
    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
  3. Christounet Messages postés 1272 Date d'inscription   Statut Membre Dernière intervention   1 393
     
    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
  4. soleil_levant Messages postés 426 Statut Membre 32
     
    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