2011-05-11 16 views
25

Estoy probando un procedimiento almacenado y quería enviar 'GETDATE()' función en lugar del parámetro:¿Usar la función como parámetro al ejecutar un procedimiento almacenado?

DECLARE @return_value int 
EXEC @return_value = my_store procedure 
     @MyId = 1, 
     @MyDateField = GETDATE() 
SELECT 'Return Value' = @return_value 
GO 

SQL Server 2005 se queja con el siguiente error:

Incorrect syntax near ')'.

Alguien le importa derramar algo de luz sobre el asunto?

Respuesta

12

por MSDN

Execute a stored procedure or function 
[ { EXEC | EXECUTE } ] 
    { 
     [ @return_status = ] 
     { module_name [ ;number ] | @module_name_var } 
     [ [ @parameter = ] { value 
          | @variable [ OUTPUT ] 
          | [ DEFAULT ] 
          } 
     ] 
     [ ,...n ] 
     [ WITH RECOMPILE ] 
    } 
[;] 

    Execute a character string 
    { EXEC | EXECUTE } 
     ({ @string_variable | [ N ]'tsql_string' } [ + ...n ]) 
     [ AS { LOGIN | USER } = ' name ' ] 
    [;] 

    Execute a pass-through command against a linked server 
    { EXEC | EXECUTE } 
     ({ @string_variable | [ N ] 'command_string [ ? ]' } [ + ...n ] 
      [ { , { value | @variable [ OUTPUT ] } } [ ...n ] ] 
     ) 
     [ AS { LOGIN | USER } = ' name ' ] 
     [ AT linked_server_name ] 
    [;] 

Aviso para que pueda @parameter especificar un valor o una vari capaz o especifique por defecto. Entonces debe establecer el valor de una variable como GetDate() (como otros han especificado) y usar esa variable.

HTH

+0

gracias Raja, eso fue útil, tengo que aprender a leer las definiciones publicadas. – krul

9

Las llamadas a funciones como parámetros no se les permite (a excepción de aquellas funciones del sistema prefijadas @@ - es decir, los que antes se llamaba variables globales)

Es necesario asignar a una variable.

Microsoft reconocen esto es menos grande en este elemento relacionado conexion: T-SQL: use scalar functions as stored procedure parameters

Agreed! More generally, wherever TSQL expects, say, and integer value, it should accept a literal, a variable, or the result of a function whose return type is integer. It just makes the language more regular ("orthogonal") and easier to learn/use.

That said, it's too late for this feature in the Katmai release, but I'll add it to our TODO list.

25

no puede utilizar una función directamente como un parámetro de procedimiento almacenado.

Usted puede hacer lo siguiente:

DECLARE @now DateTime 
SET @now = GETDATE() 

DECLARE @return_value int 
EXEC @return_value = my_stored_procedure 
     @MyId = 1, 
     @MyDateField = @now 
SELECT 'Return Value' = @return_value 
GO 
+0

Sé que puedo crear variables, pero tenía curiosidad sobre esta construcción. – krul

+0

@krul - la frase que usaste "arrojó algo de luz sobre el asunto" es ambigua. Si desea preguntar por qué existe la restricción, debe preguntar exactamente eso. – Oded

+1

@Oded: No estoy seguro si a krul le importa, pero me gustaría saberlo. ¿Por qué existe esta restricción? En casi todos los demás idiomas que conozco, puede usar una llamada de función como argumento, y funciona de la manera esperada (se evalúa la función, se pasa el valor de retorno como argumento). ¿Por qué SQL no permite esto? –

0

Probar:

DECLARE @return_value int 
EXEC @return_value = my_store procedure 
     @MyId = 1, 
     @MyDateField = (SELECT GETDATE()) 
SELECT 'Return Value' = @return_value 
GO 
-1

¿Por qué necesita para pasar en el GetDate(). Simplemente utilícelo en el Procedimiento almacenado llamado.

No puede pasarlo directamente. Basta con asignar a una variable y pasan que

DECLARE @dt as datetime 
SET @dt=GETDATE() 

EXEC @return_value = my_store procedure 
     @MyId = 1, 
     @MyDateField = dt 
1

usted podría utilizar

DECLARE @test DATE; 
SET @test = GETDATE(); 

y luego

DECLARE @return_value int 
EXEC @return_value = my_store procedure 
     @MyId = 1, 
     @MyDateField = @test 
SELECT 'Return Value' = @return_value 
GO 
Cuestiones relacionadas