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 :

Probléme dans une function


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Femme Profil pro
    PL/SQL
    Inscrit en
    Septembre 2016
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : Arabie Saoudite

    Informations professionnelles :
    Activité : PL/SQL
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 189
    Points : 65
    Points
    65
    Par défaut Probléme dans une function
    bonjour a toute et a tous

    j'utlise une function pour crée un table calendrier le script du creation me retounre l'erreur suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Msg 156, Level 15, State 1, Procedure table_calendrier, Line 14
    Incorrect syntax near the keyword 'OPTION'.
    le script du creation est le suivant
    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 table_calendrier 
    (@date1 date,@date2 date)
    returns table 
    as
    return
    (
    with cte as
    (select 1 as n,@date1 as date1,datename(weekday,@date1)as name_date,datepart(ISO_WEEK,@date1)as semaine
    union all
    select n+1,dateadd(day,n,@date1)as date1 ,datename(weekday,dateadd(day,n,@date1))as name_date,datepart(ISO_WEEK,dateadd(day,n,@date1))as semaine
    from cte where dateadd(day,n,@date1) <@date2
    )select * from cte  
     ) OPTION ( MAXRECURSION 365 )
    si j'élimine OPTION ( MAXRECURSION 365 ) tout passe bien ,mais si je fait l'appel du fuction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     select * from dbo.table_calendrier ('2016-01-01','2017-01-01')
    j'aura cette erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Msg 530, Level 16, State 1, Line 16
    The statement terminated. The maximum recursion 100 has been exhausted before statement completion.
    merci pour vos aide
    Images attachées Images attachées  

  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 770
    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 770
    Points : 52 726
    Points
    52 726
    Billets dans le blog
    5
    Par défaut
    Ceci est parfaitement normal. Une UDF (comme une vue d'ailleurs) est destinée à être intégrée à une autre routine ou requête et ne peut être exécutée seule. Par définition elle doit donc être exempt de toute instruction contradictoire avec les objets susceptible de l'encapsuler.
    Or pouvant être utilisées dans une requête qui mentionnerait une clause OPTION avec des valeurs de MAXRECURSION différente, quelle serait la valeur à prendre en compte ?
    C'est pourquoi les clauses ORDER BY (norme SQL) et OPTION (spécifique SQL Server) sont interdites dans les UDF, tout comme la mise à jour des données des tables, la gestion des transactions ou le SQl dynamique.

    C'est à la requête finale qui exécute l'UDF de préciser cette clause.

    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
    Expert éminent
    Avatar de Lyche
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2007
    Messages
    2 523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 523
    Points : 6 775
    Points
    6 775
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    Pour des raisons de performances et de quantité de dates possiblement géré, il serait préférable d'utiliser une requête non récursive.

    Voici un petit code qui gère toutes les dates entre le premier janvier de 2 années, mais cela peut se faire sur plusieurs années sans aucun souci.

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    DECLARE @DateDebut CHAR(8) = '20151231'
          , @DateFin   CHAR(8) = '20161231';
     
    SELECT TOP( DATEDIFF( DAY, @DateDebut, @DateFin) )
           DATEADD( DAY, ROW_NUMBER() OVER ( ORDER BY o.object_id), @DateDebut ) AS Journee
      FROM sys.objects o
            CROSSY JOIN sys.objects o2

    Il est facile de le placer dans une petite CTE et d'exploiter la date généré comme bon te semble par la suite

    (penser à mettre la date début 1 jour avant le début réel).

    Je te conseil aussi de ne pas utiliser les - dans tes déclarations de date. 'AAAAMMJJ' est un format que SQL Server peut convertir à la volé en tout type de dates

    Cordialement,
    Rejoignez la communauté du chat et partagez vos connaissances ou vos questions avec nous

    Mon Tutoriel pour apprendre les Agregations
    Consultez mon Blog SQL destiné aux débutants

    Pensez à FAQ SQL Server Ainsi qu'aux Cours et Tuto SQL Server

  4. #4
    Membre du Club
    Femme Profil pro
    PL/SQL
    Inscrit en
    Septembre 2016
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : Arabie Saoudite

    Informations professionnelles :
    Activité : PL/SQL
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 189
    Points : 65
    Points
    65
    Par défaut
    merci SQLpro pour votre explication détaillé

    aussi merci lyche pour votre code qui est très optimiser par comptre j'arrive pas a comprendre a quoi sert le cross join dans votre code ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      CROSSY JOIN sys.objects o2
    merci

  5. #5
    Expert éminent
    Avatar de Lyche
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2007
    Messages
    2 523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 523
    Points : 6 775
    Points
    6 775
    Billets dans le blog
    4
    Par défaut
    Le CROSS JOIN permet de créer artificiellement des lignes afin d'éviter de "manquer" de données. Je le met par réflexe parce qu'il m'est arrivé d'avoir à générer plusieurs dizaines d'années de données et que la table objects n'avait pas assez de lignes. Il est totalement facultatif, surtout sur les petits jeux de données.

    Cordialement,
    Rejoignez la communauté du chat et partagez vos connaissances ou vos questions avec nous

    Mon Tutoriel pour apprendre les Agregations
    Consultez mon Blog SQL destiné aux débutants

    Pensez à FAQ SQL Server Ainsi qu'aux Cours et Tuto SQL Server

Discussions similaires

  1. Type "groupe de controles" dans une function
    Par méphistopheles dans le forum VB 6 et antérieur
    Réponses: 15
    Dernier message: 20/06/2008, 21h07
  2. [Embedded Function] Problème dans une boucle FOR-END
    Par roilait dans le forum Simulink
    Réponses: 6
    Dernier message: 19/04/2008, 14h55
  3. problème dans une requête
    Par pierrOPSG dans le forum Langage SQL
    Réponses: 2
    Dernier message: 18/11/2005, 10h28
  4. Problème dans une procedure
    Par hpghost dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 09/01/2005, 12h14
  5. tbitmap.free dans une function
    Par portu dans le forum Langage
    Réponses: 7
    Dernier message: 19/06/2003, 22h08

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