Modifier une fonction de serveur SQL pour accepter un nouveau paramètre facultatif

J’ai déjà une fonction dans SQL Server 2005 en tant que:

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

Je souhaite modifier cette fonction pour accepter le paramètre optionnel supplémentaire @ToDate. Je vais append la logique dans la fonction si @Todate Provided fait ensuite autre chose avec le code existant.

J’ai modifié la fonction en tant que:

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

Maintenant, je peux appeler la fonction comme:

 SELECT dbo.fCalculateEstimateDate(647,GETDATE()) 

Mais cela donne une erreur sur l’appel suivant:

 SELECT dbo.fCalculateEstimateDate(647) 

comme

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

qui selon ma compréhension ne devrait pas arriver.

Est-ce que je manque quelque chose? Merci d’avance.

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 diffère de l’utilisation de parameters avec des valeurs par défaut dans les procédures stockées dans lesquelles l’omission du paramètre implique également la valeur par défaut.

Donc, vous devez faire:

 SELECT dbo.fCalculateEstimateDate(647,DEFAULT) 

La façon de conserver le fonctionnement de l’ SELECT dbo.fCalculateEstimateDate(647) est la suivante:

 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  End 

J’ai trouvé la commande EXECUTE comme suggéré ici T-SQL – fonction avec des parameters par défaut pour bien fonctionner. Avec cette approche, il n’y a pas de ‘DEFAULT’ nécessaire lors de l’appel de la fonction, vous omettez simplement le paramètre comme vous le feriez avec une procédure stockée.