在执行存储过程时使用函数作为参数?

时间:2011-05-11 15:46:26

标签: sql-server sql-server-2005 tsql stored-procedures

我正在测试存储过程并希望提交'GETDATE()'函数来代替参数:

DECLARE @return_value int

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

SELECT  'Return Value' = @return_value
GO

SQL Server 2005抱怨以下错误:

  

')'附近的语法不正确。

有人想关注此事吗?

6 个答案:

答案 0 :(得分:27)

您不能将函数直接用作存储过程参数。

您可以执行以下操作:

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

答案 1 :(得分:14)

每个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 ]
    [;]

注意@parameter您可以指定值或变量,也可以指定Default。所以你必须将变量的值设置为GetDate()(正如其他人指定的那样)并使用该变量。

HTH

答案 2 :(得分:10)

不允许函数调用作为参数(除了前缀为@@的那些系统函数 - 即那些曾经被称为全局变量的系统函数)

您需要分配给变量。

Microsoft承认这在此相关的Connect项目中不太好:T-SQL: use scalar functions as stored procedure parameters

  

同意!更一般地说,无论TSQL在哪里   期待,比方说,和整数值,它   应该接受一个文字,一个变量,   或者是一个函数的结果   返回类型是整数。它只是使   语言比较规律   (“正交”)更容易   学习/用途

     

那就是说,为时已晚   Katmai发布的功能,但是   我将它添加到我们的TODO列表中。

答案 3 :(得分:1)

您可以使用

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

然后

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

答案 4 :(得分:0)

尝试:

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

答案 5 :(得分:-1)

为什么需要传入GetDate()。只需在调用的存储过程中使用它。

您无法直接传递它。只需将其分配给变量并传递

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

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