在存储过程参数列表中使用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