Ich habe bereits eine Funktion in SQL Server 2005 als:
ALTER function [dbo].[fCalculateEstimateDate] (@vWorkOrderID numeric)
Returns varchar(100) AS
Begin
<Function Body>
End
Ich möchte diese Funktion ändern, um den zusätzlichen optionalen Parameter @ToDate zu akzeptieren. Ich füge Logik in der Funktion hinzu, wenn @Todate Provided dann etwas weiter macht, mit dem vorhandenen Code.
Ich habe die Funktion wie folgt geändert:
ALTER function [dbo].[fCalculateEstimateDate] (@vWorkOrderID numeric,@ToDate DateTime=null)
Returns varchar(100) AS
Begin
<Function Body>
End
Nun kann ich Funktion aufrufen als:
SELECT dbo.fCalculateEstimateDate(647,GETDATE())
Bei folgendem Aufruf gibt es jedoch einen Fehler:
SELECT dbo.fCalculateEstimateDate(647)
wie
Es wurden nicht genügend Argumente für das Verfahren oder .__ zur Verfügung gestellt. Funktion dbo.fCalculateEstimateDate.
was nach meinem Verständnis nicht passieren darf.
Fehlt mir etwas? Vielen Dank im Voraus.
Von CREATE FUNCTION
:
Wenn ein Parameter der Funktion einen Standardwert hat, muss beim Aufruf der Funktion das Schlüsselwort
DEFAULT
angegeben werden, um den Standardwert abzurufen. Dieses Verhalten unterscheidet sich von der Verwendung von Parametern mit Standardwerten in gespeicherten Prozeduren, bei denen das Weglassen des Parameters auch den Standardwert impliziert.
Also musst du folgendes tun:
SELECT dbo.fCalculateEstimateDate(647,DEFAULT)
SELECT dbo.fCalculateEstimateDate(647)
call funktioniert weiterhin wie folgt:
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
Ich habe den Befehl EXECUTE gefunden, wie er hier vorgeschlagen wird T-SQL - Funktion mit Standardparametern , um gut zu funktionieren. Bei diesem Ansatz ist beim Aufrufen der Funktion kein 'DEFAULT' erforderlich. Sie lassen den Parameter wie bei einer gespeicherten Prozedur weg.