2012-10-04 11 views
44

Mam już funkcji w SQL Server 2005 jako:Alter funkcję serwera SQL, aby zaakceptować nowy opcjonalny parametr

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

Chcę zmodyfikować tę funkcję, aby zaakceptować dodawania opcjonalnego parametru @ToDate. Zamierzam dodać logikę do funkcji, jeśli @Todate Provided to zrobi coś innego z istniejącym kodem.

I zmodyfikowano funkcję jako:

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

teraz mogę wywołania funkcji jak:

SELECT dbo.fCalculateEstimateDate(647,GETDATE()) 

Ale daje błąd na poniższej rozmowy:

SELECT dbo.fCalculateEstimateDate(647) 

jako

Niewystarczająca liczba argumentów została dostarczona do procedury lub funkcja dbo.fCalculateEstimateDate.

które zgodnie z moim rozumieniem nie powinno się zdarzyć.

Czy brakuje mi czegoś? Z góry dzięki.

Odpowiedz

77

Od CREATE FUNCTION:

Gdy parametr funkcji ma wartość domyślną, słowo DEFAULT musi być określona, ​​gdy funkcja jest wywoływana aby pobrać wartość domyślną. To zachowanie różni się od używania parametrów z wartościami domyślnymi w procedurach składowanych, w których pominięcie parametru powoduje również domyślną wartość.

Więc trzeba zrobić:

SELECT dbo.fCalculateEstimateDate(647,DEFAULT) 
+1

Czy istnieje sposób na zachowanie działającego polecenia SELECT dbo.fCalculateEstimateDate (647) ?? – MaxRecursion

+23

Nie. Każde wywołanie funkcji musi mieć taką samą liczbę określonych parametrów. Zawsze możesz utworzyć funkcję * new * z dwoma parametrami i przekształcić 'dbo.fCalculateEstimateDate' w funkcję owijki, która po prostu doda drugi parametr do wywołania nowej funkcji. –

+4

Dlaczego, na litość boską, różni się to od zapisanych procedur? Jestem pewien, że możesz po prostu pominąć drugi parametr i po prostu zadziała! – Peter

16

Sposobem na utrzymanie SELECT dbo.fCalculateEstimateDate(647) roboczego wezwanie brzmi:

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

Nie możesz po prostu powiedzieć 'RETURN [dbo]. [FCalculateEstimateDate_v2] (@ vWorkOrderID, DEFAULT)'? –

+0

Tak! pewnie.To jest to samo – Gus

0

Znalazłem wykonanie polecenia jako sugerowane tutaj T-SQL - function with default parameters dobrze działać. Przy takim podejściu nie jest wymagane "DEFAULT" podczas wywoływania funkcji, po prostu pominąć parametr tak, jak w przypadku procedury składowanej.

Powiązane problemy