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 :

Enlever une fonction dans la jointure


Sujet :

Développement SQL Server

  1. #1
    Membre éclairé Avatar de olivtone
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2010
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2010
    Messages : 242
    Par défaut Enlever une fonction dans la jointure
    Hello a Tous

    je voulais savoir comment je peux enlever cette fonction dans la jointure

    INNER JOIN TABLE with(nolock)
    ON dbo.FONCTION(TABLE) BETWEEN date AND date

    la fonction retourne ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE function [dbo].[toto](	@UTCTime  datetime)
    returns datetime
    as 
    begin
     
    	return DATEADD(MINUTE,dbo.TABLE_HEURE(@UTCTime),@UTCTime)
    CA me plombe les perfomances SQL !!

    merci a tous

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 010
    Billets dans le blog
    6
    Par défaut
    Normal, mais que fait cette fonction dbo.TABLE_HEURE ?
    SI elle utilise une table, mettez la description et son contenu...

    Quelle version de SQL Server ?

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    Ce n'est pas sargable (voir http://blog.developpez.com/sqlpro/p1...sql_sargable_c).
    Il faut reporter la logique de la fonction directement dans la requête.

  4. #4
    Membre éclairé Avatar de olivtone
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2010
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2010
    Messages : 242
    Par défaut
    desole du retard, En fait cela appele la colonne d'une vue dbo.car_rib qui fait 3 km :

    la requete complete en gras la fonction qui est appelé dans la jointure:

    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
    SELECT DISTINCT RIB.id_ribid as xx
    	,convert(varchar(5),xx) as xx
    	,convert(varchar(5),xx) as xx
    	,convert(varchar(11),xx) as xx
    	,dbo.fn_UTCToLocalTime2(date_autorisation) as xx
    	,dbo.fn_UTCToLocalTime2(RIB.createdon) as xx
    	,dbo.fn_UTCToLocalTime2(RIB.modifiedon) as xx
    FROM BDD.dbo.car_rib RIB with(nolock)
    INNER JOIN dbo.V_ODS_SYNCHRO SYN with
    	ON dbo.fn_UTCToLocalTime2(RIB.modifiedon) BETWEEN SYN.DT_DEBUT AND SYN.DT_FIN
    WHERE (RIB.contactid is NOT NULL )
    
    UNION
    
    SELECT DISTINCT  RIB.id_ribid as xx
    	,convert(varchar(5),xx) as xx
    	,convert(varchar(5),xx) as xx
    	,convert(varchar(11),xx) as xx
    	,dbo.fn_UTCToLocalTime2(date_autorisation) as xx
    	,dbo.fn_UTCToLocalTime2(RIB.createdon) as xx
    	,dbo.fn_UTCToLocalTime2(RIB.modifiedon) as xx
    FROM BDD.dbo.car_rib RIB with
    INNER JOIN dbo.V_ODS_SYNCHRO SYN with
    	ON dbo.fn_UTCToLocalTime2(RIB.modifiedon) BETWEEN SYN.DT_DEBUT AND SYN.DT_FIN
    WHERE CTR.billing IS NOT NULL
    AND CTR.identifiant_adhesion is not null

  5. #5
    Membre éclairé Avatar de olivtone
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2010
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2010
    Messages : 242
    Par défaut
    et voici ce qu'il y a dans la fonction

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    CREATE function [dbo].[toto](	@UTCTime  datetime)
    returns datetime
    as 
    begin
     
    	return DATEADD(MINUTE,dbo.F_HEURE(@UTCTime),@UTCTime)
     
    et F_HEURE retourne ceci :
     
    -DECLARE @AN0 DATETIME;
    --SET @AN0 = '20091019';
    DECLARE @DD1 DATETIME,@DD2 DATETIME;
    DECLARE @AN AS CHAR(4);
    SET @AN = CAST(YEAR(@AN0) as CHAR(4)) ;
     
    -- passage à l'heure d'été, le dernier dimanche de mars à 1h  
     
       SET @DD1 = CAST(@AN + '0331 02:00' AS DATETIME);  
     
       WHILE DATEPART(weekday, @DD1) <> 7  
     
          SET @DD1 = DATEADD(day, -1, @DD1);  
     
    -- passage à l'heure d'hiver, le dernier dimanche d'octobre à 1h  
     
          SET @DD2 = CAST(@AN + '1031 02:00' AS DATETIME);  
     
          WHILE DATEPART(weekday, @DD2) <> 7  
     
             SET @DD2 = DATEADD(day, -1, @DD2);  
     
     
      --SELECT @AN0 as an0,@DD1 as dd1,DATEDIFF(DAY,@DD1,@AN0) as diff
      --SELECT @AN0 as an0,@DD2 as dd2,DATEDIFF(DAY,@DD2,@AN0) as diff
     
       IF DATEDIFF(DAY,@DD1,@AN0)> 0 and DATEDIFF(DAY,@DD2,@AN0)<0
       BEGIN
       --ETE
       RETURN 120
       END
       ELSE
       BEGIN
       --HIVER
       RETURN 60
       END
     
       --INSERT INTO @T VALUES (@AN0);
       --INSERT INTO @T VALUES (@DD1);
       --INSERT INTO @T VALUES (@DD2);
     --  INSERT INTO @T VALUES ('DD1'+CAST(@DD1 as nvarchar));
     --  INSERT INTO @T VALUES ('DD2' +CAST(@DD2 as nvarchar));
     --  INSERT INTO @T VALUES ('AN0'+CAST(@AN0 as nvarchar));
    	--INSERT INTO @T VALUES (''+DATEDIFF(day,@AN0,@DD1));
    	--INSERT INTO @T VALUES (''+DATEDIFF(day,@DD2,@AN0));
     
     
    RETURN 0;  
     
    END     
     
     
     
     
    GO

Discussions similaires

  1. Utilisation d'une fonction dans une procedure
    Par MaxiMax dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 09/08/2005, 15h51
  2. Comment rappeler une fonction dans une liste déroulante
    Par strogos dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 05/05/2005, 23h54
  3. Appel d'une fonction dans uns boucle d'un tableau
    Par PrinceMaster77 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 04/02/2005, 15h37
  4. Réponses: 4
    Dernier message: 26/01/2005, 13h08
  5. Programmation d'une fonction dans Rn
    Par simone.51 dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 12/11/2004, 11h30

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