为了账号安全,请及时绑定邮箱和手机立即绑定

在存储过程参数列表中使用表达式的结果(例如,函数调用)?

在存储过程参数列表中使用表达式的结果(例如,函数调用)?

汪汪一只猫 2019-11-04 09:29:42
我试图编写一个存储过程来协助我们的数据库开发,但是在使用它时遇到了一些麻烦。例如:DECLARE @pID int;SET @pID = 1;EXEC WriteLog 'Component', 'Source', 'Could not find given id: ' + CAST(@pID AS varchar);这将产生错误(在SQL Server 2005上):消息102,级别15,状态1,第4行'+'附近的语法不正确。有人可以向我解释为什么我的语法不正确以及解决此问题的正确方法吗?
查看完整描述

3 回答

?
慕码人8056858

TA贡献1803条经验 获得超6个赞

您需要使用一个中间变量。尽管SQL Server已经出现在TODO列表中有几年了,但它本身在参数列表中不支持这种操作!(请参阅“ 连接项目:使用标量函数作为存储过程参数”)


的语法EXEC是


[ { EXEC | EXECUTE } ]

    { 

      [ @return_status = ]

      { module_name [ ;number ] | @module_name_var } 

        [ [ @parameter = ] { value 

                           | @variable [ OUTPUT ] 

                           | [ DEFAULT ] 

                           }

        ]

      [ ,...n ]

      [ WITH <execute_option> [ ,...n ] ]

    }

[;]

该文档目前尚不清楚可接受格式,value但似乎仅仅是“简单”表达式,例如文字值或带@@前缀的系统函数(例如@@IDENTITY)。SCOPE_IDENTITY()不允许使用其他系统功能(甚至不允许使用不需要括号的功能CURRENT_TIMESTAMP)。


所以暂时您需要使用如下语法


DECLARE @pID INT;


SET @pID = 1;


/*If 2008+ for previous versions this needs to be two separate statements*/

DECLARE @string VARCHAR(50) = 'Could not find given id: ' + CAST(@pID AS VARCHAR(11))


EXEC WriteLog

  'Component',

  'Source',

  @string 


查看完整回答
反对 回复 2019-11-04
?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

您不能对存储过程的参数进行操作。您应该在另一个变量上分配该值,然后将其传递给SP。


DECLARE @pID int, @nameId VARCHAR(100);

SET @pID = 1;

SET @nameId = 'Could not find given id: ' + CAST(@pID AS varchar);


EXEC WriteLog 'Component', 'Source', @nameId


查看完整回答
反对 回复 2019-11-04
  • 3 回答
  • 0 关注
  • 656 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信