Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在执行存储过程时使用函数作为参数?_Sql Server_Sql Server 2005_Tsql_Stored Procedures - Fatal编程技术网

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

Sql server 在执行存储过程时使用函数作为参数?,sql-server,sql-server-2005,tsql,stored-procedures,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投诉出现以下错误: “')附近的语法不正确 有人想解释一下这个问题吗?

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

DECLARE @return_value int

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

SELECT  'Return Value' = @return_value
GO
SQL Server 2005投诉出现以下错误:

“')附近的语法不正确


有人想解释一下这个问题吗?

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

您需要分配给一个变量

Microsoft承认,在这个相关的连接项目中,这不是很好:

同意!更一般地说,只要TSQL 期望,比如说,和整数值,它 应该接受一个文本,一个变量, 或者一个函数的结果 返回类型为整数。这只会让你 语言更加规范 (“正交”)并且更容易 学习/使用

话虽如此,但为时已晚 Katmai版本中的功能,但是 我会把它添加到我们的待办事项列表中


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

您可以执行以下操作:

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
尝试:

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

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
每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

我知道我可以创建变量,但我对这个构造很好奇。@krul-您使用的短语“阐明了这一问题”是模棱两可的。如果你想问为什么会有这种限制,你应该问清楚。@Oded:我不确定krul是否在乎,但我想知道。这项限制为何存在?在我所知道的几乎所有其他语言中,都可以使用函数调用作为参数,并且它以预期的方式工作(对函数求值,将返回值作为参数传递)。为什么SQL不允许这样做?@TimGoodman-我没有理由支持你,这是只有微软才能回答的问题。据猜测,我认为优化器没有足够的关于不同函数性能的统计数据(不要忘记您可以创建用户定义的函数),因此无法做出正确的决策。有可能设计决策只是简单地不允许它们(顺便说一句,这都是猜测)。谢谢Raja,这很有帮助,我必须学习阅读发布的定义。不起作用(有永远有用的消息:语法错误)