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 :

[2000] getdate dans une fonction


Sujet :

MS SQL Server

  1. #1
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut [2000] getdate dans une fonction
    Bonjour

    Je suis confronté à un souci qui me laisse trés perplexe d'autant plus que je ne trouve pas de doc là dessus.

    je fais une fonction tabulaire comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    ALTER FUNCTION dbo.MILI_Liste_Actif (@Appl_Name VARCHAR(50)) 
    RETURNS TABLE AS
    RETURN (
     
    SELECT M.LoweredEmail,
    Sexe,
    YEAR(GetDate()) - YEAR(Date_Naissance) AS Age,
    MD.* 
    FROM MILI_MembresDetail MD
    INNER JOIN aspnet_Users U ON U.UserName = MD.UserName
    INNER JOIN aspnet_MemberShip M ON M.UserId = U.UserId
    WHERE MD.Type_Membre = 1
    et il me dit :
    Serveur : Msg 443, Niveau 16, État 1, Procédure MILI_Liste_Actif, Ligne 7
    Utilisation incorrecte de 'getdate' à l'intérieur d'une fonction.
    Donc j'en reste sur mon céan et je ne comprends rien. Dans l'aide SQL y rien qui parle de ça. Avec GOOGLE, pas mieux et dans la FAQ ici, j'ai rien vu

    Pouvez vous m'aider ?
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

  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
    21 839
    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 : 21 839
    Points : 52 932
    Points
    52 932
    Billets dans le blog
    5
    Par défaut
    Les fonctions SQL 2000 doivent être déterministes par nature. Donc toute opération introduisant un paramétre susceptible de donner un résultat non déterministe est interdit. Par exemple CURRENT_TIMESTAMP (ou GETDATE) ou encore RAND...

    Différentes solutions de contournement existe, comme par exemple le passage du paramètre en argument :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE FUNCTION dbo.F_T_MILI_Liste_Actif 
                    (@Appl_Name VARCHAR(50), @DH DATETIME) 
    RETURNS TABLE AS
    RETURN (SELECT M.LoweredEmail, Sexe,
                   YEAR(DH) - YEAR(Date_Naissance) AS Age,
                   MD.* 
            FROM   MILI_MembresDetail MD
                   INNER JOIN aspnet_Users U 
                         ON U.UserName = MD.UserName
                   INNER JOIN aspnet_MemberShip M 
                         ON M.UserId = U.UserId
            WHERE MD.Type_Membre = 1)
    GO
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    -- appel de la fonction :
    SELECT *
    FROM   dbo.F_T_MILI_Liste_Actif('Colonnel SPOUNTZ', CURRENT_TIMESTAMP)
    Mais que viennentn faire tous ces militaires ??? ;-)

    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 extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut
    Ok, merci pour ton aide.

    Donc, pas de getdate() parce que ça "bouge". Je vais être obligé de retenir le passage d'un paramettre, même si ça me plait pas trop.

    Merci beaucoup.

    PS : MILI c'est le diminutif du nom du nom du projet dans lequelle je travaille et pas des militaires. Mais l'idée est interessante.
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 240
    Points : 210
    Points
    210
    Par défaut
    Tout à fait exact.

    Ayant été confronté au même problème, je faisais passer le getdate() en paramètre de la fonction, en tout cas en SQL 2000.

    En SQL 2005, le getdate() est permis à l'intérieur de la fonction

    A Bientôt.

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 839
    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 : 21 839
    Points : 52 932
    Points
    52 932
    Billets dans le blog
    5
    Par défaut
    Exacte aussi, mais très honnêtement ce n'est pas à conseiller. En effet si une fonction n'est pas déterministe alors cela signifie qu'il faut l'exécuter à chaque ligne ! Autrement dit si 1 million de ligne => un million d'exécution de la fonction. Alors que si déterministe il suffit de regarder les paramètres d'entrée et si l'on a déjà calculée la fonction pour ces mêmes valeurs (tri) alors il est inutile de la rejouer, il suffit de reprendre le résultats déjà obtenu...

    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/ * * * * *

  6. #6
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut
    Merci pour ce complément d'inforamtion.

    En fait, je fais cela avec une fonction pour récupérer une table, donc cela ne sera lu qu'une fois. Ensuite je fais des requêtes sur cette table.

    Mais l'ennui c'est que je ne me rappelle pas pourquoi je le fais avec une fonction et pas une Procédure. Mais ça va revenir, je pense.
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. utilisation de getdate() dans une fonction ?
    Par devdev dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 08/03/2005, 17h40
  2. GETDATE() dans une fonction
    Par joul's dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 16/02/2005, 10h37
  3. Utilisation de Getdate dans une fonction
    Par BaronSamdi dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 16/11/2004, 10h12
  4. [Postgresql]Connecter à une autre base dans une fonction
    Par alex2205 dans le forum Requêtes
    Réponses: 2
    Dernier message: 05/05/2003, 11h30
  5. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14

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