Измените функцию 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.
который, согласно моему пониманию, не должен происходить.
Я что-то пропустил?
Спасибо заранее.
Ответы
Ответ 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", когда вы вызываете функцию, вы просто опускаете параметр так же, как и с хранимой процедурой.