81

我已经在 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)

作为

为过程或函数 dbo.fCalculateEstimateDate 提供的参数数量不足。

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

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

4

3 回答 3

122

来自CREATE FUNCTION

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

所以你需要这样做:

SELECT dbo.fCalculateEstimateDate(647,DEFAULT)
于 2012-10-04T07:07:28.453 回答
28

保持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
于 2015-05-06T15:05:46.933 回答
2

我发现这里建议的 EXECUTE 命令T-SQL - 使用默认参数的函数可以正常工作。使用这种方法,调用函数时不需要“DEFAULT”,您只需像使用存储过程一样省略参数。

于 2016-10-03T20:42:15.913 回答