更改SQL Server函数以接受新的可选参数

时间:2012-10-04 06:59:21

标签: sql sql-server-2005

我已经在SQL Server 2005中有一个函数:

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

我想修改此函数以接受可选参数@ToDate。我将在函数中添加逻辑,如果@Todate提供,那么继续使用现有代码执行其他操作。

我将函数修改为:

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。

根据我的理解不应该发生。

我错过了什么吗? 提前谢谢。

3 个答案:

答案 0 :(得分:97)

来自CREATE FUNCTION

  

当函数的参数具有默认值时,必须在调用函数时指定关键字DEFAULT以检索默认值。此行为与在存储过程中使用具有默认值的参数不同,其中省略参数也意味着默认值。

所以你需要这样做:

SELECT dbo.fCalculateEstimateDate(647,DEFAULT)

答案 1 :(得分:21)

保持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

答案 2 :(得分:0)

我发现这里T-SQL - function with default parameters建议的EXECUTE命令运行良好。使用这种方法,调用函数时不需要“DEFAULT”,只需省略参数就像存储过程一样。