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

我试图编写一个存储过程来协助开发我们的数据库,但是我在使用它时遇到了一些麻烦。 例如:

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在“+”附近有错误的语法。

有人可以向我解释为什么我的语法不正确,解决这个问题的正确方法?

你需要使用一个中间variables。 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的可接受格式目前还不清楚,但它似乎只是“简单的”expression式,如文字值或@@前缀的系统函数(如@@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 
 DECLARE @pID int; declare @IdAsString varchar(100) SET @pID = 1; Select @IdAsString ='Could not find given id: ' + Cast(@pId as varchar(10)) EXEC WriteLog 'Component', 'Source', @IdAsString 

正如马丁所指出的那样,以下仅适用于不是variables的列。

请注意,我已经修改你的转换为varchar(10)这将允许整数大于1位数。 varchar将只允许1个字符

您不能对存储过程的参数进行操作。 您应该将该值分配给另一个variables,然后将其传递给您的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 

也许这样?

 DECLARE @pID int; SET @pID = 1; DECLARE @Message NVARCHAR(50); SET @Message = 'Could not find given id: ' + CAST(@pID AS varchar) EXEC WriteLog 'Component', 'Source', @Message; 

试试这个…

 DECLARE @pID int; SET @pID = 1; DECLARE @message varchar(255); SET @message = 'Could not find given id: ' + CAST(@pID AS varchar) EXEC WriteLog 'Component', 'Source', @message; 

DECLARE @id int

SET @id = 10

SELECT LTRIM(RTRIM(STR(@id)))AS stringValue