2012-01-31 45 views
1

为什么我不能这样做?为什么我不能在EXEC语句上使用NCHAR函数

EXEC mySproc NCHAR(0xA5) 

我得到

附近有语法错误的0xA5“。但

,我能做到这一点

DECLARE @foo NCHAR 
SET @foo = NCHAR(0xA5) 
EXEC mySproc @foo 

即使这样

SELECT NCHAR(0xA5) 

有趣的是,SQL服务器如何选择计算表达式。有什么想法吗?

+0

为什么-1?我希望知道为什么。 – 2012-01-31 16:06:47

+1

[请参阅此相关的连接项目请求](https://connect.microsoft。COM/SQLServer的/反馈/信息/ 352110/T-SQL使用标量函数-AS-存储过程参数)。答案是“为什么?”似乎是他们只是没有得到它。 – 2012-02-05 12:34:19

回答

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提供程序将值绑定到从左到右的参数 。

如果参数的值是由数据库名称或模式名称限定的对象名称,字符串或 ,则整个名称必须使用单引号括起来的 。如果参数的值是关键字 ,则该关键字必须用双引号括起来。

如果在模块中定义了默认值,用户可以在不指定参数的情况下执行模块 。

默认值也可以是NULL。通常,模块定义 指定如果参数值为NULL,则应执行的操作。

从而

首先要进行所有的计算,将这些结果放入变量,然后传递变量到SP的呼叫

2

您不能将函数调用作为参数传递给存储过程。你必须首先评估他们(正如你在你的第二个例子一样),然后把它们放入

你可以看到,这也将失败。

exec myProc len('abc') 
+0

这是为什么?对我来说似乎很愚蠢。 – 2012-01-31 15:57:41

+0

它的EXECUTE行为如何,'execute('select'+ NCHAR(0xA5))'也会失败 – 2012-01-31 15:59:32

+0

对我来说这似乎也是不幸的。有很多次它会简单得多,但事实就是这样。奥列格对此有一个很好的答案。 – 2012-01-31 16:09:55

相关问题