Подтвердить что ты не робот

Измените функцию SQL-сервера, чтобы принять новый необязательный параметр

У меня уже есть функция в SQL Server 2005:

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

Я хочу изменить эту функцию, чтобы принять дополнительный дополнительный параметр @ToDate. Я собираюсь добавить логику в функцию, если @Todate Provided, а затем сделать что-то еще с существующим кодом.

Я изменил функцию как:

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

Теперь я могу вызвать функцию как:

SELECT dbo.fCalculateEstimateDate(647,GETDATE())

Но он дает ошибку при следующем вызове:

SELECT dbo.fCalculateEstimateDate(647)

а

Недостаточное количество аргументов было предоставлено для процедуры или function dbo.fCalculateEstimateDate.

который, согласно моему пониманию, не должен происходить.

Я что-то пропустил? Спасибо заранее.

4b9b3361

Ответ 1

От CREATE FUNCTION:

Когда параметр функции имеет значение по умолчанию, ключевое слово DEFAULT должно указываться при вызове функции для получения значения по умолчанию. Это поведение отличается от использования параметров со значениями по умолчанию в хранимых процедурах, в которых опускание параметра также подразумевает значение по умолчанию.

Итак, вам нужно сделать:

SELECT dbo.fCalculateEstimateDate(647,DEFAULT)

Ответ 2

Способ сохранения работы SELECT dbo.fCalculateEstimateDate(647):

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

Ответ 3

Я нашел команду EXECUTE, как предложено здесь T-SQL - функция с параметрами по умолчанию, чтобы хорошо работать. При таком подходе нет необходимости "DEFAULT", когда вы вызываете функцию, вы просто опускаете параметр так же, как и с хранимой процедурой.