4

微软 SQL 服务器 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

?

4

1 回答 1

8

您可以将文字值或变量传递给 an 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_

命名过程时避免使用sp_前缀。SQL Server 使用此前缀来指定系统过程。如果存在同名的系统过程,使用前缀可能会导致应用程序代码中断。


1 Martin 指出可以调用某些函数,但这在很大程度上是例外而不是规则,因此虽然我的陈述不是 100% 准确,但这样对待它不会对您造成伤害。

于 2013-06-28T14:50:02.200 回答