我正在测试存储过程并希望提交'GETDATE()'函数来代替参数:
DECLARE @return_value int
EXEC @return_value = my_stored_procedure
@MyId = 1,
@MyDateField = GETDATE()
SELECT 'Return Value' = @return_value
GO
SQL Server 2005抱怨以下错误:
')'附近的语法不正确。
有人想关注此事吗?
答案 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