2011-05-11 114 views
25

我测试的存储过程,并希望提交 'GETDATE()' 函数中位置参数的:在执行存储过程时使用函数作为参数?

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

SQL Server 2005的抱怨与以下错误:

Incorrect syntax near ')'.

有人关心棚关于此事的一些启示?

回答

12
每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可以要么指定一个值,要么指定一个vari能够或指定默认值。所以你必须将变量的值设置为GetDate()(正如其他人指定的那样)并使用该变量。

HTH

+0

谢谢Raja,这很有帮助,我必须学习阅读发布的定义。 – krul 2011-05-11 16:33:31

9

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

您需要分配给一个变量。

微软承认这是小于大在这个相关连接项目: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

不能直接使用函数作为存储过程的参数。

你可以做到以下几点:

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

我知道我可以创建变量,但我很好奇这个构造。 – krul 2011-05-11 15:54:26

+0

@krul - 您使用的短语“在这个问题上提供了一些亮点”是不明确的。如果你想问为什么限制存在,你应该问清楚。 – Oded 2011-05-11 16:07:42

+1

@Oded:我不确定krul是否在意,但我想知道。为什么这个限制存在?在我所知的其他所有语言中,可以使用函数调用作为参数,并以预期的方式工作(函数被评估,返回值作为参数传递)。为什么SQL不允许这样做? – 2012-06-25 18:34:00

0

尝试:

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

为什么你需要在GETDATE通过()。只需在被调用的存储过程中使用它即可。

您无法直接将其传入。只要将它分配给一个变量,并传递

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

EXEC @return_value = my_store procedure 
     @MyId = 1, 
     @MyDateField = dt 
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 
相关问题