为什么我不能这样做?为什么我不能在EXEC语句上使用NCHAR函数
EXEC mySproc NCHAR(0xA5)
我得到
附近有语法错误的0xA5“。但
,我能做到这一点
DECLARE @foo NCHAR
SET @foo = NCHAR(0xA5)
EXEC mySproc @foo
即使这样
SELECT NCHAR(0xA5)
有趣的是,SQL服务器如何选择计算表达式。有什么想法吗?
为什么我不能这样做?为什么我不能在EXEC语句上使用NCHAR函数
EXEC mySproc NCHAR(0xA5)
我得到
附近有语法错误的0xA5“。但
,我能做到这一点
DECLARE @foo NCHAR
SET @foo = NCHAR(0xA5)
EXEC mySproc @foo
即使这样
SELECT NCHAR(0xA5)
有趣的是,SQL服务器如何选择计算表达式。有什么想法吗?
,因为它违反了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提供程序将值绑定到从左到右的参数 。
如果参数的值是由数据库名称或模式名称限定的对象名称,字符串或 ,则整个名称必须使用单引号括起来的 。如果参数的值是关键字 ,则该关键字必须用双引号括起来。
如果在模块中定义了默认值,用户可以在不指定参数的情况下执行模块 。
默认值也可以是NULL。通常,模块定义 指定如果参数值为NULL,则应执行的操作。
从而
首先要进行所有的计算,将这些结果放入变量,然后传递变量到SP的呼叫
您不能将函数调用作为参数传递给存储过程。你必须首先评估他们(正如你在你的第二个例子一样),然后把它们放入
你可以看到,这也将失败。
exec myProc len('abc')
这是为什么?对我来说似乎很愚蠢。 – 2012-01-31 15:57:41
它的EXECUTE行为如何,'execute('select'+ NCHAR(0xA5))'也会失败 – 2012-01-31 15:59:32
对我来说这似乎也是不幸的。有很多次它会简单得多,但事实就是这样。奥列格对此有一个很好的答案。 – 2012-01-31 16:09:55
为什么-1?我希望知道为什么。 – 2012-01-31 16:06:47
[请参阅此相关的连接项目请求](https://connect.microsoft。COM/SQLServer的/反馈/信息/ 352110/T-SQL使用标量函数-AS-存储过程参数)。答案是“为什么?”似乎是他们只是没有得到它。 – 2012-02-05 12:34:19