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

Dan*_*ite 1 sql t-sql sql-server

为什么我不能这样做?

EXEC mySproc NCHAR(0xA5)
Run Code Online (Sandbox Code Playgroud)

我明白了

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

但是,我可以做到这一点

DECLARE @foo NCHAR
SET @foo = NCHAR(0xA5)
EXEC mySproc @foo
Run Code Online (Sandbox Code Playgroud)

甚至这个

SELECT NCHAR(0xA5)
Run Code Online (Sandbox Code Playgroud)

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

Ole*_*Dok 5

因为它违反了T-SQL 存储过程调用语法,该语法指出:

Execute a stored procedure or function
[ { EXEC | EXECUTE } ]
    { 
      [ @return_status = ]
      { module_name [ ;number ] | @module_name_var } 
        [ [ @parameter = ] { value 
                           | @variable [ OUTPUT ] 
                           | [ DEFAULT ] 
                           }
        ]
      [ ,...n ]
      [ WITH RECOMPILE ]
    }
[;]
Run Code Online (Sandbox Code Playgroud)

哪里有价值

是要传递给模块或传递命令的参数值.如果未指定参数名称,则必须按模块中定义的顺序提供参数值.

对链接服务器执行传递命令时,参数值的顺序取决于链接服务器的OLE DB提供程序.大多数OLE DB提供程序从左到右将值绑定到参数.

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

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

默认值也可以为NULL.通常,模块定义指定参数值为NULL时应采取的操作.

从而

您应该首先执行所有计算,将结果放入变量,然后将变量传递给SP调用