web-dev-qa-db-fra.com

Modifier une fonction 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
  <Function Body>
End

Je souhaite modifier cette fonction pour accepter l'ajout du paramètre facultatif @ToDate. Je vais ajouter une logique dans la fonction si @Todate Fourni puis faire quelque chose d'autre continuer 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
  <Function Body>
End

Maintenant, je peux appeler la fonction en tant que:

SELECT dbo.fCalculateEstimateDate(647,GETDATE())

Mais cela donne une erreur lors de l'appel suivant:

SELECT dbo.fCalculateEstimateDate(647)

comme

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

qui selon ma compréhension ne devrait pas se produire.

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

54
MaxRecursion

De CREATE FUNCTION :

Lorsqu'un paramètre de la fonction a une valeur par défaut, le mot clé DEFAULT doit être spécifié lors de l'appel de la fonction 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 dans lesquelles l'omission du paramètre implique également la valeur par défaut.

Donc vous devez faire:

SELECT dbo.fCalculateEstimateDate(647,DEFAULT)
90

Pour que l'appel SELECT dbo.fCalculateEstimateDate(647) fonctionne correctement,

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
20
Gus

J'ai trouvé la commande EXECUTE comme suggéré ici T-SQL - fonction avec les paramètres 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.

0
Learning2Code