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 :

UDF avec les paramètres par défaut


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Luxembourg

    Informations forums :
    Inscription : Mars 2007
    Messages : 616
    Par défaut UDF avec les paramètres par défaut
    J'ai un pb pourquoi je suis obligé de rentrer tous les paramètres de ma 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
    IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'dbo.DWH_GET_MAXDATE') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
    	DROP FUNCTION dbo.DWH_GET_MAXDATE
    GO
     
    CREATE FUNCTION DWH_GET_MAXDATE(
    	@d1 DATETIME = null, 
    	@d2 DATETIME = null, 
    	@d3 DATETIME = null, 
    	@d4 DATETIME = null,
    	@d5 DATETIME = null, 
    	@d6 DATETIME = null, 
    	@d7 DATETIME = null, 
    	@d8 DATETIME = null,
    	@d9 DATETIME = null, 
    	@d10 DATETIME  = null
    )
    	RETURNS DATETIME
    AS
    -- Fonction qui retourne la date maximale parmi les 10 passées en paramètre
    BEGIN
    	DECLARE @max DATETIME;
     
    	WITH 
    		TabDates (dates) 
    	AS (
    		SELECT @d1 UNION ALL 
    		SELECT @d2 UNION ALL 
    		SELECT @d3 UNION ALL 
    		SELECT @d4 UNION ALL 
    		SELECT @d5 UNION ALL 
    		SELECT @d6 UNION ALL 
    		SELECT @d7 UNION ALL 
    		SELECT @d8 UNION ALL 
    		SELECT @d9 UNION ALL 
    		SELECT @d10 UNION ALL
    		SELECT '19500101'
    	)
    	SELECT @max = MAX(dates)
    	FROM TabDates;
     
    	RETURN @max;
    END
    GO
    Lorsque je demande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT [dbo].[DWH_GET_MAXDATE] ('20011231', '20000101' )
    j'ai un message :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Msg 313, Level 16, State 2, Line 1
    An insufficient number of arguments were supplied for the procedure or function dbo.DWH_GET_MAXDATE.
    Comment ça se fait? Pourquoi suis-je obligé de donner les 10 paramètres? A quoi servent les valeurs par défaut? Je rappelle juste la définition:
    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
    Scalar Functions
    CREATE FUNCTION [ schema_name. ] function_name 
    ( [ { @parameter_name [ AS ][ type_schema_name. ] parameter_data_type 
        [ = default ] } 
        [ ,...n ]
      ]
    )
    RETURNS return_data_type
        [ WITH <function_option> [ ,...n ] ]
        [ AS ]
        BEGIN 
                    function_body 
            RETURN scalar_expression
        END
    [ ; ]

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    Effectivement je ne comprends pas trop pourquoi, même si pour moi une fonction de devrait pas avoir de paramètres optionnels.

    Vous pouvez écrire :

    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
    ALTER FUNCTION DWH_GET_MAXDATE(@listeDates VARCHAR(512))
    	RETURNS DATETIME
    AS
    BEGIN
    	SET @listeDates = '19500101,' + @listeDates;
     
    	DECLARE @max DATETIME;
     
    	WITH
    		CTE (Deb, Fin) AS 
    		( 
    				SELECT 1 Deb, CHARINDEX(',', @listeDates + ',') Fin 
    			UNION ALL 
    				SELECT Fin + 1, CHARINDEX(',', @listeDates + ',', Fin + 1) 
    				FROM CTE 
    				WHERE CHARINDEX( ',', @listeDates + ',', Fin + 1 ) > 0 
    		)
    	SELECT @max = MAX(CAST(SUBSTRING(@listeDates, Deb , Fin - Deb) AS DATETIME))
    	FROM CTE;
     
    	RETURN @max
    END;
    Ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT dbo.DWH_GET_MAXDATE('20011231,20000101')
    Retourne :

    2001-12-31 00:00:00.000

  3. #3
    Membre expérimenté
    Inscrit en
    Février 2009
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 224
    Par défaut
    LEs valeurs par défaut sont bien prises en compte mais il faut préciser le mot clé DEFAULT donc pas vraiment souple à utiliser.
    Dans votre cas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT [dbo].[DWH_GET_MAXDATE] ('20011231', '20000101',DEFAULT,DEFAULT,DEFAULT,DEFAULT,DEFAULT,DEFAULT,DEFAULT,DEFAULT )

  4. #4
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Luxembourg

    Informations forums :
    Inscription : Mars 2007
    Messages : 616
    Par défaut
    Citation Envoyé par jero44 Voir le message
    LEs valeurs par défaut sont bien prises en compte mais il faut préciser le mot clé DEFAULT donc pas vraiment souple à utiliser.
    Effectivement ce n'est pas souple du tout.

    Mais ce qui est étonnant, c'est que pour une procédure ça marche !
    La preuve :
    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
    CREATE procedure GET_MAXDATE(
    	@d1 DATETIME = NULL, 
    	@d2 DATETIME = NULL, 
    	@d3 DATETIME = NULL, 
    	@d4 DATETIME = NULL,
    	@d5 DATETIME = NULL, 
    	@d6 DATETIME = NULL, 
    	@d7 DATETIME = NULL, 
    	@d8 DATETIME = NULL,
    	@d9 DATETIME = NULL, 
    	@d10 DATETIME  = NULL
    )
    AS
     
    BEGIN
    	DECLARE @max DATETIME;
     
    	WITH 
    		TabDates (dates) 
    	AS (
    		SELECT @d1 UNION ALL 
    		SELECT @d2 UNION ALL 
    		SELECT @d3 UNION ALL 
    		SELECT @d4 UNION ALL 
    		SELECT @d5 UNION ALL 
    		SELECT @d6 UNION ALL 
    		SELECT @d7 UNION ALL 
    		SELECT @d8 UNION ALL 
    		SELECT @d9 UNION ALL 
    		SELECT @d10 UNION ALL
    		SELECT '19500101'
    	)
    	SELECT @max = MAX(dates)
    	FROM TabDates;
     
    	print @max;
    END
    GO
     
    exec GET_MAXDATE '20011231', '20000101'

  5. #5
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Pareil, je ne comprends pas du tout pourquoi, même après avoir parcouru la documentation ...

    @++

  6. #6
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Luxembourg

    Informations forums :
    Inscription : Mars 2007
    Messages : 616
    Par défaut
    Citation Envoyé par elsuket Voir le message
    Pareil, je ne comprends pas du tout pourquoi, même après avoir parcouru la documentation ...

    @++
    Je suis sous 2005, c'est pareil sous 2008?

Discussions similaires

  1. Créer un graph (nuage de points) avec les abscisses par défaut
    Par Ub1quity dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 19/02/2012, 19h15
  2. Réponses: 8
    Dernier message: 08/05/2009, 23h07
  3. Modifier les paramètres par défaut d'un port série
    Par aleister dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 06/03/2008, 17h12
  4. Problème avec les valeurs par défaut
    Par Steph Ace dans le forum Requêtes
    Réponses: 3
    Dernier message: 12/12/2005, 09h55
  5. Restaurer les paramètres par défaut au démarrage
    Par Manu14400 dans le forum Access
    Réponses: 1
    Dernier message: 22/09/2005, 15h21

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