MS SQL Server 2008。

为什么这个解析没问题:

CREATE TABLE #Held
(
    Value decimal(18,4)
)
INSERT #Held EXEC dbo.sp_Held '2013-06-27', NULL

但这会导致语法错误('day' 附近的语法不正确。):
CREATE TABLE #Held
(
    Value decimal(18,4)
)
INSERT #Held EXEC dbo.sp_Held DATEADD(day, -1, getdate()), NULL

?

最佳答案

您可以向 EXEC 传递一个字面值或一个变量,而没有其他任何东西 - 值得注意的是,您不能有任何形式的复杂表达式或函数调用1。所以如果你想计算一个值,你需要把它放在一个单独的语句中的变量中:

CREATE TABLE #Held
(
    Value decimal(18,4)
)
DECLARE @a datetime
SET @a = DATEADD(day, -1, getdate())
INSERT #Held EXEC dbo.sp_Held @a, NULL

此外,您应该避免命名以 sp_ 开头的存储过程:



1 Martin 指出有些函数可以被调用,但这只是异常(exception)而不是规则,所以虽然我的陈述不是 100% 准确,但这样对待它不会伤害你。

10-08 13:34