¿Función SQL como valor de parámetro predeterminado?

105

Intenté cambiar un valor de parámetro predeterminado con esto:

ALTER PROCEDURE [dbo].[my_sp]
@currentDate datetime = GETDATE()

y todo lo que me dio el precompilador de SQL fue este error:

Msg 102, Nivel 15, Estado 1, Procedimiento my_sp, Línea 8 Sintaxis incorrecta cerca de '('.

Ya he creado el procedimiento. (No estoy seguro de si eso es relevante). Estaba usando un valor predeterminado nulo y comprobándolo más tarde, pero eso no parece correcto. ¿Puedo hacer esto en una línea?


Actualización: me estaba saliendo de la descripción de MSDN de los parámetros del procedimiento almacenado :

[= predeterminado] Es un valor predeterminado para el parámetro. Si se define un valor predeterminado, la función se puede ejecutar sin especificar un valor para ese parámetro.

Nota:
Se pueden especificar valores de parámetros predeterminados para funciones CLR excepto para los tipos de datos varchar (max) y varbinary (max).

Cuando un parámetro de la función tiene un valor predeterminado, la palabra clave DEFAULT debe especificarse cuando se llama a la función 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.

¿Estoy leyendo esto mal?

Muchas gracias.

user58044
fuente

Respuestas:

160

El valor predeterminado para el parámetro de procedimientos almacenados debe ser constante . Debería hacer lo siguiente ...

ALTER Procedure [dbo].[my_sp]
@currentDate datetime = null
AS
IF @currentDate is null
SET @currentDate = getdate()
Brian Kim
fuente
36
o SET @currentDate = COALESCE (@ currentDate, GETDATE ())
SQLMenace
Lo estaba usando anteriormente. "Estaba usando un valor predeterminado nulo y comprobándolo más tarde, pero no parece adecuado". Aún así, gracias Brian.
user58044
Esta solución es perfecta.
R.Katnaan
35

No creo que sea posible, tienes que usar un valor literal (constante) como predeterminado.

Sin embargo, puede hacer esto:

Set @currentDate = Coalesce(@currentDate , GetDate())
Otávio Décio
fuente
13

Puedes intentar lo siguiente:

Set @CurrentDate=IsNull(@CurrentDate,GetDate())
R.Katnaan
fuente
8

Deduzco que está usando Microsoft SQL Server por los corchetes en su ejemplo.

Desde MSDN :

Solo un valor constante, como una cadena de caracteres; una función escalar (ya sea una función del sistema, definida por el usuario o CLR); o NULL se puede utilizar de forma predeterminada.

La función GETDATE()devuelve un valor diferente de vez en cuando, por lo que no es una expresión constante.

Bill Karwin
fuente
2

Ese valor no es determinista y no se puede utilizar

SQLMenace
fuente
0

Sugerencia:

Establecer el valor predeterminado en NULL

Haga lo predeterminado GETDATE()en la interfaz.

Marlon Tribunal
fuente