如何将某些变量的值插入到存储过程中的字符串中?

时间:2016-01-29 17:47:11

标签: sql-server

我有这段代码:

BEGIN
   ;THROW 50003,'UserTestStatusAction - Did not find a row matching Role, Current and New status',1
END

这是我到目前为止所尝试的内容:

BEGIN
   ;THROW 50003,'UserTestStatusAction - Did not find a row matching Role' + @Role + ', Current' +  @CurrentTestStatusId + 'and New status ' + @NewTestStatusId,1
END

我也试过这个:

BEGIN
   ;THROW 50003,CONCAT('UserTestStatusAction - Did not find a row matching Role',@Role,', Current',@CurrentTestStatusId,'and New status ',@NewTestStatusId),1
END

如何将@ Role,@ CurrentTestStatusId和@NewTestStatusId的值插入此字符串?我尝试了+运算符,但这给了我一个语法错误。

2 个答案:

答案 0 :(得分:2)

在调用THROW或其他类似函数时,我认为你不能将表达式作为参数(所有参数都必须是常量或变量)。

无论如何,我建议事先计算你的字符串,因为这也允许相应地处理NULL值:

DECLARE @error VARCHAR(MAX) = 
   'UserTestStatusAction - Did not find a row matching Role ' + ISNULL(CAST(@Role AS VARCHAR(100)), '') + 
   ', Current ' + ISNULL(CAST(@CurrentTestStatusId AS VARCHAR(50)), '') + 
   'and New status ' + ISNULL(CAST(@NewTestStatusId AS VARCHAR(50)), '');

THROW 51000, @error, 1;

如果你的任何标记为NULL,这可以防止所有字符串无效。

答案 1 :(得分:1)

declare @Role  varchar(20) = 'admin';

DECLARE @msg NVARCHAR(2048) = 'UserTestStatusAction - Did not find a row matching Role ' + @Role

;THROW 51000, @msg, 1;