2012-10-04 25 views
44

我已經在SQL Server 2005中的功能:改變SQL服務器功能來接受新的可選參數

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。

根據我的理解應該不會發生。

我錯過了什麼? 在此先感謝。

回答

77

CREATE FUNCTION

當函數的參數有一個缺省值,當函數被調用來檢索缺省值關鍵字DEFAULT必須指定。此行爲不同於在存儲過程中使用具有默認值的參數,其中省略參數也意味着默認值。

所以,你需要做的:

SELECT dbo.fCalculateEstimateDate(647,DEFAULT) 
+1

有什麼辦法保持SELECT dbo.fCalculateEstimateDate(647)調用工作? – MaxRecursion

+23

否。每個函數調用都必須指定相同數量的參數。你總是可以用兩個參數創建一個* new *函數,並將'dbo.fCalculateEstimateDate'變成一個包裝函數,它簡單地添加第二個參數來調用新函數。 –

+4

爲什麼這與存儲過程有所不同?林肯定你可以跳過第二個參數,它會工作! – Peter

16

的方式,讓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

難道你不能說'RETURN [dbo]。[fCalculateEstimateDate_v2](@ vWorkOrderID,DEFAULT)'? –

+0

是的!當然。一樣的 – Gus