为什么我不能这样做?
EXEC mySproc NCHAR(0xA5)
我得到了
'0xa5'附近的语法不正确。
然而,我可以做到这一点
DECLARE @foo NCHAR
SET @foo = NCHAR(0xA5)
EXEC mySproc @foo
甚至这个
SELECT NCHAR(0xA5)
SQL服务器如何选择评估表达式很有趣。有什么想法吗?
答案 0 :(得分:5)
因为它违反了T-SQL stored procedure call syntax,其中声明:
Execute a stored procedure or function
[ { EXEC | EXECUTE } ]
{
[ @return_status = ]
{ module_name [ ;number ] | @module_name_var }
[ [ @parameter = ] { value
| @variable [ OUTPUT ]
| [ DEFAULT ]
}
]
[ ,...n ]
[ WITH RECOMPILE ]
}
[;]
其中值
参数的值是否传递给模块或传递 命令。如果未指定参数名称,则必须包含参数值 按照模块中定义的顺序提供。
对链接服务器执行传递命令时,顺序 参数值的大小取决于链接的OLE DB提供程序 服务器。大多数OLE DB提供程序将值绑定到左侧的参数 对。
如果参数的值是对象名,字符串或 由数据库名称或模式名称限定,整个名称必须是 用单引号括起来。如果参数的值是a 关键字,关键字必须用双引号括起来。
如果模块中定义了默认值,则用户可以执行该模块 没有指定参数。
默认值也可以为NULL。通常,模块定义 指定参数值为时应采取的操作 NULL。
<强>从而强>
首先应执行所有计算,将结果放入变量,然后将变量传递给SP调用
答案 1 :(得分:2)
您不能将函数调用作为参数传递给存储过程。您必须首先评估它们(就像您在第二个示例中所做的那样),然后将它们传入。
您可以看到这也会失败:
exec myProc len('abc')