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 :

optimiser le code d'une fonction


Sujet :

MS SQL Server

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    428
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 428
    Points : 60
    Points
    60
    Par défaut optimiser le code d'une fonction
    Bonjour;

    Comment optimiser la structure d'une fonction (éviter la redondance du code). J'aimerais écrire la même structure qu'une procédure fonction en fonction du parametre s'execute telle action.
    Exemple de fonctions :

    CREATE FUNCTION dbo.F_USER_Obj (@SocieteID numeric(9), @UserID numeric(9), @CritNom varchar(50), @DateCourante char(8))
    RETURNS @user TABLE (
    SocieteID numeric(9),
    USerID numeric(9),
    Nom varchar(50),
    Prenom varchar(50),
    CiviliteID numeric(9),
    CiviliteLib varchar(50),
    Telephone varchar(20),
    Fax varchar(20),
    Email varchar(50),
    )
    AS
    BEGIN
    DECLARE @Nom varchar(50)
    DECLARE @Prenom varchar(50)
    DECLARE @CiviliteID numeric(9)
    DECLARE @CiviliteLib varchar(50)
    DECLARE @Telephone varchar(20)
    DECLARE @Fax varchar(20)
    DECLARE @Email varchar(50)

    IF (@UserID IS NULL)
    BEGIN
    IF (@CritNom IS NULL)
    BEGIN
    DECLARE parcour_table CURSOR FOR SELECT USER.ENTI_NOK AS UserID,
    ENTITE.ENTI_NOM AS Nom,
    PERSONNE.PRS_PRENOM AS Prenom,
    PERSONNE.CVLT_NOK AS CiviliteID,
    CIVILITE.CVLT_Lib AS CiviliteLib,
    USER.BENE_TEL AS Telephone,
    USER.BENE_FAX AS Fax,
    USER.BENE_EMAIL AS Email,
    FROM dbo.USER (NOLOCK)
    INNER JOIN dbo.PERSONNE (NOLOCK) ON (PERSONNE.ENTI_NOK=USER.ENTI_NOK)
    INNER JOIN dbo.ENTITE (NOLOCK) ON (ENTITE.ENTI_NOK=USER.ENTI_NOK)
    LEFT JOIN dbo.SALARIE (NOLOCK) ON ((SALARIE.SOC_ENTI_NOK=USER.SOC_ENTI_NOK) AND (SALARIE.ENTI_NOK=USER.ENTI_NOK))
    LEFT JOIN dbo.ADRESSE AS ADR_FISC (NOLOCK) ON ((ADR_FISC.ENTI_NOK=USER.ENTI_NOK) AND (ADR_FISC.ADR_NOK=dbo.F_BENEF_AdrFisc(USER.SOC_ENTI_NOK,USER.ENTI_NOK,@DateCourante)))
    LEFT JOIN dbo.ADRESSE AS ADR_POST (NOLOCK) ON ((ADR_POST.ENTI_NOK=USER.ENTI_NOK) AND (ADR_POST.ADR_NOK=dbo.F_BENEF_AdrPost(USER.SOC_ENTI_NOK,USER.ENTI_NOK,@DateCourante)))
    LEFT JOIN dbo.PAYS AS PAYS_FISC (NOLOCK) ON (PAYS_FISC.PAYS_NOK=ADR_FISC.PAYS_NOK)
    LEFT JOIN dbo.PAYS AS PAYS_POST (NOLOCK) ON (PAYS_POST.PAYS_NOK=ADR_POST.PAYS_NOK)
    LEFT JOIN dbo.CIVILITE (NOLOCK) ON (CIVILITE.CVLT_NOK=PERSONNE.CVLT_NOK)
    WHERE (USER.SOC_ENTI_NOK=@SocieteID)
    END ELSE BEGIN
    DECLARE parcour_table CURSOR FOR SELECT USER.ENTI_NOK AS USERID,
    ENTITE.ENTI_NOM AS Nom,
    PERSONNE.PRS_PRENOM AS Prenom,
    PERSONNE.CVLT_NOK AS CiviliteID,
    CIVILITE.CVLT_Lib AS CiviliteLib,
    USER.BENE_TEL AS Telephone,
    USER.BENE_FAX AS Fax,
    USER.BENE_EMAIL AS Email,
    FROM dbo.USER (NOLOCK)
    INNER JOIN dbo.PERSONNE (NOLOCK) ON (PERSONNE.ENTI_NOK=USER.ENTI_NOK)
    INNER JOIN dbo.ENTITE (NOLOCK) ON (ENTITE.ENTI_NOK=USER.ENTI_NOK)
    LEFT JOIN dbo.SALARIE (NOLOCK) ON ((SALARIE.SOC_ENTI_NOK=USER.SOC_ENTI_NOK) AND (SALARIE.ENTI_NOK=USER.ENTI_NOK))
    LEFT JOIN dbo.ADRESSE AS ADR_FISC (NOLOCK) ON ((ADR_FISC.ENTI_NOK=USER.ENTI_NOK) AND (ADR_FISC.ADR_NOK=dbo.F_BENEF_AdrFisc(USER.SOC_ENTI_NOK,USER.ENTI_NOK,@DateCourante)))
    LEFT JOIN dbo.ADRESSE AS ADR_POST (NOLOCK) ON ((ADR_POST.ENTI_NOK=USER.ENTI_NOK) AND (ADR_POST.ADR_NOK=dbo.F_BENEF_AdrPost(USER.SOC_ENTI_NOK,USER.ENTI_NOK,@DateCourante)))
    LEFT JOIN dbo.PAYS AS PAYS_FISC (NOLOCK) ON (PAYS_FISC.PAYS_NOK=ADR_FISC.PAYS_NOK)
    LEFT JOIN dbo.PAYS AS PAYS_POST (NOLOCK) ON (PAYS_POST.PAYS_NOK=ADR_POST.PAYS_NOK)
    LEFT JOIN dbo.CIVILITE (NOLOCK) ON (CIVILITE.CVLT_NOK=PERSONNE.CVLT_NOK)
    WHERE ((USER.SOC_ENTI_NOK=@SocieteID) AND (ENTITE.ENTI_NOM LIKE @CritNom))
    END
    END ELSE BEGIN
    IF (@CritNom IS NULL)
    BEGIN
    DECLARE parcour_table CURSOR FOR SELECT USER.ENTI_NOK AS USERID,
    ENTITE.ENTI_NOM AS Nom,
    PERSONNE.PRS_PRENOM AS Prenom,
    PERSONNE.CVLT_NOK AS CiviliteID,
    CIVILITE.CVLT_Lib AS CiviliteLib,
    USER.BENE_TEL AS Telephone,
    USER.BENE_FAX AS Fax,
    USER.BENE_EMAIL AS Email,
    FROM dbo.USER (NOLOCK)
    INNER JOIN dbo.PERSONNE (NOLOCK) ON (PERSONNE.ENTI_NOK=USER.ENTI_NOK)
    INNER JOIN dbo.ENTITE (NOLOCK) ON (ENTITE.ENTI_NOK=USER.ENTI_NOK)
    LEFT JOIN dbo.SALARIE (NOLOCK) ON ((SALARIE.SOC_ENTI_NOK=USER.SOC_ENTI_NOK) AND (SALARIE.ENTI_NOK=USER.ENTI_NOK))
    LEFT JOIN dbo.ADRESSE AS ADR_FISC (NOLOCK) ON ((ADR_FISC.ENTI_NOK=USER.ENTI_NOK) AND (ADR_FISC.ADR_NOK=dbo.F_BENEF_AdrFisc(USER.SOC_ENTI_NOK,USER.ENTI_NOK,@DateCourante)))
    LEFT JOIN dbo.ADRESSE AS ADR_POST (NOLOCK) ON ((ADR_POST.ENTI_NOK=USER.ENTI_NOK) AND (ADR_POST.ADR_NOK=dbo.F_BENEF_AdrPost(USER.SOC_ENTI_NOK,USER.ENTI_NOK,@DateCourante)))
    LEFT JOIN dbo.PAYS AS PAYS_FISC (NOLOCK) ON (PAYS_FISC.PAYS_NOK=ADR_FISC.PAYS_NOK)
    LEFT JOIN dbo.PAYS AS PAYS_POST (NOLOCK) ON (PAYS_POST.PAYS_NOK=ADR_POST.PAYS_NOK)
    LEFT JOIN dbo.CIVILITE (NOLOCK) ON (CIVILITE.CVLT_NOK=PERSONNE.CVLT_NOK)
    WHERE ((USER.SOC_ENTI_NOK=@SocieteID) AND (USER.ENTI_NOK=@USERID))
    END ELSE BEGIN
    DECLARE parcour_table CURSOR FOR SELECT USER.ENTI_NOK AS USERID,
    ENTITE.ENTI_NOM AS Nom,
    PERSONNE.PRS_PRENOM AS Prenom,
    PERSONNE.CVLT_NOK AS CiviliteID,
    CIVILITE.CVLT_Lib AS CiviliteLib,
    USER.BENE_TEL AS Telephone,
    USER.BENE_FAX AS Fax,
    USER.BENE_EMAIL AS Email,
    FROM dbo.USER (NOLOCK)
    INNER JOIN dbo.PERSONNE (NOLOCK) ON (PERSONNE.ENTI_NOK=USER.ENTI_NOK)
    INNER JOIN dbo.ENTITE (NOLOCK) ON (ENTITE.ENTI_NOK=USER.ENTI_NOK)
    LEFT JOIN dbo.SALARIE (NOLOCK) ON ((SALARIE.SOC_ENTI_NOK=USER.SOC_ENTI_NOK) AND (SALARIE.ENTI_NOK=USER.ENTI_NOK))
    LEFT JOIN dbo.ADRESSE AS ADR_FISC (NOLOCK) ON ((ADR_FISC.ENTI_NOK=USER.ENTI_NOK) AND (ADR_FISC.ADR_NOK=dbo.F_BENEF_AdrFisc(USER.SOC_ENTI_NOK,USER.ENTI_NOK,@DateCourante)))
    LEFT JOIN dbo.ADRESSE AS ADR_POST (NOLOCK) ON ((ADR_POST.ENTI_NOK=USER.ENTI_NOK) AND (ADR_POST.ADR_NOK=dbo.F_BENEF_AdrPost(USER.SOC_ENTI_NOK,USER.ENTI_NOK,@DateCourante)))
    LEFT JOIN dbo.PAYS AS PAYS_FISC (NOLOCK) ON (PAYS_FISC.PAYS_NOK=ADR_FISC.PAYS_NOK)
    LEFT JOIN dbo.PAYS AS PAYS_POST (NOLOCK) ON (PAYS_POST.PAYS_NOK=ADR_POST.PAYS_NOK)
    LEFT JOIN dbo.CIVILITE (NOLOCK) ON (CIVILITE.CVLT_NOK=PERSONNE.CVLT_NOK)
    WHERE ((USER.SOC_ENTI_NOK=@SocieteID) AND (USER.ENTI_NOK=@USERID) AND (ENTITE.ENTI_NOM LIKE @CritNom))
    END
    END

    OPEN parcour_table
    FETCH NEXT FROM parcour_table INTO @USERID, @Nom, @Prenom, @CiviliteID, @CiviliteLib, @Telephone, @Fax, @Email,
    WHILE @@FETCH_STATUS = 0
    BEGIN
    IF @@FETCH_STATUS <> -2
    BEGIN
    INSERT INTO @USER (SocieteID, USERID, Nom, Prenom, CiviliteID, CiviliteLib, Telephone, Fax, Email) VALUES (@SocieteID, @USERID, @Nom, @Prenom, @CiviliteID, @CiviliteLib, @Telephone, @Fax, @Email, END
    FETCH NEXT FROM parcour_table INTO @USERID, @Nom, @Prenom, @CiviliteID, @CiviliteLib, @Telephone, @Fax, @Email) END
    CLOSE parcour_table
    DEALLOCATE parcour_table
    RETURN
    END

    Merci;

  2. #2
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 222
    Points : 19 551
    Points
    19 551
    Billets dans le blog
    25
    Par défaut
    C'est hyper lourd.

    Pourquoi un curseur dans une fonction et pas un "simple" INSERT ... SELECT dans une SP ?

    Evitez l'usage des fonctions dans les conditions : ca pourri l'utilisation d'éventuels indexes.
    Sr DBA Oracle / MS-SQL / MySQL / Postgresql / SAP-Sybase / Informix / DB2

    N'oublie pas de consulter mes articles, mon blog, les cours et les FAQ SGBD

    Attention : pas de réponse technique par MP : pensez aux autres, passez par les forums !

Discussions similaires

  1. optimiser mon code avec une boucle for?
    Par Invité dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 16/11/2007, 08h33
  2. Optimisation de paramètres d'une fonction de transfert
    Par miloutcheque dans le forum Signal
    Réponses: 1
    Dernier message: 29/06/2007, 12h36
  3. [NASM] Optimiser le code d'une droite
    Par powerpsy dans le forum Assembleur
    Réponses: 1
    Dernier message: 28/04/2006, 23h27
  4. Optimisation du code dans une page JSP
    Par nikalkal dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 27/04/2006, 15h58
  5. [Tableaux] demande de code pour une fonction.php
    Par carmen256 dans le forum Langage
    Réponses: 4
    Dernier message: 21/01/2006, 17h22

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