web-dev-qa-db-fra.com

Utiliser la fonction comme paramètre lors de l'exécution d'une procédure stockée?

Je teste une procédure stockée et je voulais soumettre la fonction 'GETDATE ()' à la place du paramètre:

DECLARE @return_value int

EXEC @return_value = my_stored_procedure
        @MyId = 1,
        @MyDateField = GETDATE()

SELECT  'Return Value' = @return_value
GO

SQL Server 2005 se plaint de l'erreur suivante:

Syntaxe incorrecte près de ')'.

Quelqu'un veut-il faire la lumière sur la question?

28
krul

par 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 ]
    [;]

Remarquez que pour @parameter, vous pouvez soit spécifier une valeur ou une variable, soit spécifier Default. Vous devez donc définir la valeur d'une variable comme GetDate () (comme d'autres l'ont spécifié) et utiliser cette variable.

HTH

14
Raja

Vous ne pouvez pas utiliser une fonction directement comme paramètre de procédure stockée.

Vous pouvez effectuer les opérations suivantes:

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
27
Oded

Les appels de fonction en tant que paramètres ne sont pas autorisés (sauf pour les fonctions système préfixées @@ - c'est-à-dire celles qui étaient auparavant appelées variables globales)

Vous devez affecter à une variable.

Microsoft reconnaît que c'est moins que génial dans cet élément Connect connexe: T-SQL: utilisez les fonctions scalaires comme paramètres de procédure stockée

D'accord! Plus généralement, partout où TSQL attend, disons, et une valeur entière, il doit accepter un littéral, une variable ou le résultat d'une fonction dont le type de retour est entier. Cela rend la langue plus régulière ("orthogonale") et plus facile à apprendre/utiliser.

Cela dit, il est trop tard pour cette fonctionnalité dans la version Katmai, mais je vais l'ajouter à notre liste TODO.

10
Martin Smith

Vous pourriez utiliser

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

puis

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

Essayer:

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