2012-10-04 7 views
44

Ho già una funzione in SQL Server 2005 come:modificare una funzione di server SQL di accettare nuovo parametro opzionale

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

Voglio modificare questa funzione per accettare Inoltre parametro opzionale @ToDate. Aggiungerò la logica in funzione se @Todate Provided fa poi qualcos'altro continuare con il codice esistente.

ho modificato la funzione come:

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

Adesso posso chiamare la funzione come:

SELECT dbo.fCalculateEstimateDate(647,GETDATE()) 

ma dà errore sul seguente chiamata:

SELECT dbo.fCalculateEstimateDate(647) 

come

Un numero insufficiente di argomenti è stato fornito per la procedura o la funzione dbo.fCalculateEstimateDate.

che secondo la mia comprensione non dovrebbe accadere.

Mi manca qualcosa? Grazie in anticipo.

risposta

77

Da CREATE FUNCTION:

Quando un parametro della funzione ha un valore predefinito, la parola chiave DEFAULT deve essere specificato quando la funzione viene chiamata per recuperare il valore di default. Questo comportamento è diverso dall'utilizzo di parametri con valori predefiniti nelle stored procedure in cui l'omissione del parametro implica anche il valore predefinito.

quindi è necessario fare:

SELECT dbo.fCalculateEstimateDate(647,DEFAULT) 
+1

C'è un modo per mantenere la chiamata SELECT dbo.fCalculateEstimateDate (647) funzionante ?? – MaxRecursion

+23

No. Ogni chiamata alla funzione deve avere lo stesso numero di parametri specificato. È sempre possibile creare una * nuova * funzione con due parametri e girare 'dbo.fCalculateEstimateDate' in una funzione wrapper che aggiunge semplicemente il secondo parametro per chiamare la nuova funzione. –

+4

perché questo differisce dalle procedure memorizzate? Sono abbastanza sicuro di poter saltare il secondo parametro e funzionerebbe! – Peter

16

Il modo per mantenere SELECT dbo.fCalculateEstimateDate(647) chiamata di lavoro è:

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

Non puoi dire semplicemente 'RETURN [dbo]. [FCalculateEstimateDate_v2] (@ vWorkOrderID, DEFAULT)'? –

+0

Sì! sicuro.È lo stesso – Gus

0

ho trovato il comando EXECUTE come suggerito qui T-SQL - function with default parameters di lavorare bene. Con questo approccio non è necessario alcun 'DEFAULT' quando si chiama la funzione, si omette semplicemente il parametro come si farebbe con una stored procedure.

Problemi correlati