82 votes

Modifier une fonction du serveur SQL pour accepter un nouveau paramètre optionnel

J'ai déjà une fonction dans SQL Server 2005 comme :

ALTER function [dbo].[fCalculateEstimateDate] (@vWorkOrderID numeric)
Returns varchar(100)  AS
Begin
  <Function Body>
End

Je souhaite modifier cette fonction pour accepter l'ajout d'un paramètre facultatif @ToDate. Je vais ajouter une logique dans la fonction si @Todate Fourni alors faire quelque chose d'autre continuer avec le code existant.

J'ai modifié la fonction comme suit :

ALTER function [dbo].[fCalculateEstimateDate] (@vWorkOrderID numeric,@ToDate DateTime=null)
Returns varchar(100)  AS
Begin
  <Function Body>
End

Je peux maintenant appeler la fonction en tant que :

SELECT dbo.fCalculateEstimateDate(647,GETDATE())

Mais il y a une erreur lors de l'appel suivant :

SELECT dbo.fCalculateEstimateDate(647)

comme

Un nombre insuffisant d'arguments a été fourni pour la procédure ou fonction dbo.fCalculateEstimateDate.

ce qui, d'après ce que j'ai compris, ne devrait pas se produire.

Ai-je oublié quelque chose ? Merci d'avance.

125voto

Damien_The_Unbeliever Points 102139

De CREATE FUNCTION :

Lorsqu'un paramètre de la fonction a une valeur par défaut, le mot-clé DEFAULT doit être spécifié lorsque la fonction est appelée pour récupérer la valeur par défaut. Ce comportement est différent de l'utilisation de paramètres avec des valeurs par défaut dans les procédures stockées, où l'omission du paramètre implique également la valeur par défaut.

Vous devez donc le faire :

SELECT dbo.fCalculateEstimateDate(647,DEFAULT)

29voto

Gus Points 291

La façon de garder SELECT dbo.fCalculateEstimateDate(647) appelant à travailler est :

ALTER function [dbo].[fCalculateEstimateDate] (@vWorkOrderID numeric)
Returns varchar(100)  AS
   Declare @Result varchar(100)
   SELECT @Result = [dbo].[fCalculateEstimateDate_v2] (@vWorkOrderID,DEFAULT)
   Return @Result
Begin
End

CREATE function [dbo].[fCalculateEstimateDate_v2] (@vWorkOrderID numeric,@ToDate DateTime=null)
Returns varchar(100)  AS
Begin
  <Function Body>
End

2voto

Ed Stevens Points 36

J'ai trouvé la commande EXECUTE comme suggéré ici T-SQL - fonction avec paramètres par défaut pour bien fonctionner. Avec cette approche, il n'y a pas besoin de "DEFAULT" lors de l'appel de la fonction, il suffit d'omettre le paramètre comme dans le cas d'une procédure stockée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X