为什么我不能在EXEC语句中使用NCHAR函数

时间:2012-01-31 15:52:41

标签: sql sql-server tsql

为什么我不能这样做?

EXEC mySproc NCHAR(0xA5)

我得到了

  

'0xa5'附近的语法不正确。

然而,我可以做到这一点

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

甚至这个

SELECT NCHAR(0xA5)

SQL服务器如何选择评估表达式很有趣。有什么想法吗?

2 个答案:

答案 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')