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

  1. #1
    Membre confirmé
    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
    Points : 556
    Points
    556
    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 : 43
    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
    Points : 12 371
    Points
    12 371
    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 actif
    Inscrit en
    Février 2009
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 224
    Points : 269
    Points
    269
    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 confirmé
    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
    Points : 556
    Points
    556
    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 : 43
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Pareil, je ne comprends pas du tout pourquoi, même après avoir parcouru la documentation ...

    @++

  6. #6
    Membre confirmé
    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
    Points : 556
    Points
    556
    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?

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 917
    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 917
    Points : 51 693
    Points
    51 693
    Billets dans le blog
    6
    Par défaut
    C'est logique. C'est même la norme qui impose cela. les paramètres étant positionnel (ORDINAL_POSITION dans INFORMATION_SCHEMA.PARAMETERS) le seul moyen d'omettre un paramètre est de spécifier littéralement qu'il faut ne pas en tenir compte.
    En effet le but d'une UDF c'est essentiellement d'être appelée dans une requête, donc en principe d'avoir tous ses paramètres valués.

    A +

  8. #8
    Membre confirmé
    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
    Points : 556
    Points
    556
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    C'est logique. C'est même la norme qui impose cela. les paramètres étant positionnel (ORDINAL_POSITION dans INFORMATION_SCHEMA.PARAMETERS) le seul moyen d'omettre un paramètre est de spécifier littéralement qu'il faut ne pas en tenir compte.
    En effet le but d'une UDF c'est essentiellement d'être appelée dans une requête, donc en principe d'avoir tous ses paramètres valués.
    Et dans une procédure les paramètres ne sont pas positionnes?

    En VB les paramètres de fonction peuvent être optionnels.

  9. #9
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 917
    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 917
    Points : 51 693
    Points
    51 693
    Billets dans le blog
    6
    Par défaut
    Hélas non, car la syntaxe des procédures stockée est apparue dans Sybase SQL Server avant la norme SQL (module PSM : Persistent Stored Modules). De ce fait la syntaxe Sybase avait pris une position qui n'a pas été retenue par la norme SQL. On a conservé cette mauvaise syntaxe pour des raisons de compatibilité ascendante.
    Mais dans la norme c'est aussi positionnel.

    En VB les paramètres de fonction peuvent être optionnels.
    Quand à VB ce n'est pas un langage, c'est un produit. Il n'existe pas de norme ni de standard pour VB et je vous rapelle que le B de VB veut dire BASIC, qui est l'acronyme de Beginner All Purpose Symbolic instruction Code, que je traduirais par langage pour adolescent boutonneux bidouilleur d'informatique !

    A +

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