【问题标题】:Using function as a parameter when executing a stored procedure? [duplicate]执行存储过程时使用函数作为参数? [复制]
【发布时间】:2011-05-11 15:46:26
【问题描述】:

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

DECLARE @return_value int

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

SELECT  'Return Value' = @return_value
GO

SQL Server 2005 报错如下:

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

有人愿意解释一下吗?

【问题讨论】:

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


    【解决方案1】:

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

    您可以执行以下操作:

    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
    

    【讨论】:

    • 我知道我可以创建变量,但我对这个结构很好奇。
    • @krul - 你使用的短语“阐明问题”是模棱两可的。如果你想问为什么存在限制,你应该问清楚。
    • @Oded:我不确定 krul 是否在乎,但我想知道。为什么会有这个限制?在我所知道的几乎所有其他语言中,您都可以使用函数调用作为参数,并且它以预期的方式工作(函数被评估,返回值作为参数传递)。为什么 SQL 不允许这样做?
    • @TimGoodman - 我没有理由给你,这是只有微软才能回答的问题。猜测一下,我相信优化器没有足够的关于不同函数性能的统计数据(不要忘记你可以创建用户定义的函数),所以不能做出好的决定。设计决策可能只是简单地禁止它们(顺便说一句,这都是猜测)。
    【解决方案2】:

    根据 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 您可以指定一个值或一个变量或指定默认值。因此,您必须将变量的值设置为 GetDate()(正如其他人指定的那样)并使用该变量。

    HTH

    【讨论】:

    • 感谢 Raja,这很有帮助,我必须学习阅读发布的定义。
    【解决方案3】:

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

    您需要分配给一个变量。

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

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

    也就是说,为时已晚 Katmai 版本中的功能,但 我会将它添加到我们的 TODO 列表中。

    【讨论】:

      【解决方案4】:

      你可以使用

      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
      

      【讨论】:

        【解决方案5】:

        试试:

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

        【讨论】:

        • 不起作用(总是有用的消息:语法不正确)
        猜你喜欢
        • 1970-01-01
        • 2016-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-31
        • 2010-12-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多