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


72

我在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提供的参数数量不足。

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

我有什么想念的吗?提前致谢。

Answers:


116

来自CREATE FUNCTION

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

因此,您需要执行以下操作:

SELECT dbo.fCalculateEstimateDate(647,DEFAULT)

2
有什么办法可以保持SELECT dbo.fCalculateEstimateDate(647)调用正常工作?
2012年

32
否。每个对函数的调用必须指定相同数量的参数。您总是可以使用两个参数创建一个函数,然后将其dbo.fCalculateEstimateDate转换为包装函数,该函数只需添加第二个参数即可调用该新函数。
Damien_The_Unbeliever 2012年

7
为什么这与存储过程有什么不同?我很确定您可以跳过第二个参数,它将正常工作!
彼得

4
@Peter-T-SQL是一种非常严格的语言。在奇怪和令人惊讶的地方有很多疣。我无法给出导致这种差异的实际原因,但是由于存储过程始终出现在独立的上下文中,而不是作为较大语句的一部分出现,因此它可能与解析相关。
Damien_The_Unbeliever 2015年

5
@Peter它是由没有常识或db使用经验的人编写的
dvdmn

25

保持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
你不能说RETURN [dbo].[fCalculateEstimateDate_v2] (@vWorkOrderID,DEFAULT)吗?
德里克·托姆斯

是! 当然。一样
Gus 2015年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.