2012-10-04 15 views
44

Ya tengo una función en SQL Server 2005 como:alterar una función de servidor SQL para aceptar nuevo parámetro opcional

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

Quiero modificar esta función para aceptar Además @ToDate parámetro opcional. Voy a agregar la lógica en la función si @Todate proporcionado luego hacer algo más continuar con el código existente.

he modificado la función como:

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

Ahora puedo llamar a la función como:

SELECT dbo.fCalculateEstimateDate(647,GETDATE()) 

pero da error en llamada siguiente:

SELECT dbo.fCalculateEstimateDate(647) 

como

Se ha proporcionado un número de argumentos insuficiente para el procedimiento o función dbo.fCalculateEstimateDate.

que según mi comprensión no debería suceder.

¿E-mail perdiendo cualquier cosa? Gracias de antemano.

Respuesta

77

De CREATE FUNCTION:

Cuando un parámetro de la función tiene un valor predeterminado, la palabra clave DEFAULT Se debe especificar la función se llama para recuperar el valor predeterminado. Este comportamiento es diferente de usar parámetros con valores predeterminados en procedimientos almacenados en los que omitir el parámetro también implica el valor predeterminado.

Así que hay que hacer:

SELECT dbo.fCalculateEstimateDate(647,DEFAULT) 
+1

¿Hay alguna manera de mantener SELECCIONADA la llamada a dbo.fCalculateEstimateDate (647)? – MaxRecursion

+23

No. Cada llamada a la función debe tener el mismo número de parámetros especificados. Siempre puede crear una función * nueva * con dos parámetros y convertir 'dbo.fCalculateEstimateDate' en una función de envoltura que simplemente agrega el segundo parámetro para llamar a la nueva función. –

+4

¿por qué en la tierra esto difiere de los procedimientos almacenados? Estoy bastante seguro de que puedes omitir el segundo parámetro y ¡simplemente funcionará! – Peter

16

La manera de mantener SELECT dbo.fCalculateEstimateDate(647) de trabajo llamada es:

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

¿No puede simplemente decir 'RETORNO [dbo]. [FCalculateEstimateDate_v2] (@ vWorkOrderID, DEFAULT)'? –

+0

¡Sí! Por supuesto.Es lo mismo – Gus

0

He encontrado el comando EXECUTE como se sugiere aquí T-SQL - function with default parameters funcione bien. Con este enfoque no es necesario 'DEFAULT' al llamar a la función, solo omite el parámetro como lo haría con un procedimiento almacenado.

Cuestiones relacionadas