Usando o resultado de uma expressão (por exemplo, chamada de function) em uma lista de parâmetros de procedimento armazenado?

Estou tentando escrever um procedimento armazenado para auxiliar no desenvolvimento do nosso database, mas estou tendo problemas para usá-lo. Por exemplo:

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

Isso produz o erro (no SQL Server 2005)

Msg 102, Level 15, State 1, Line 4 Sintaxe incorreta perto de ‘+’.

Alguém pode me explicar por que minha syntax está incorreta e a maneira correta de resolver esse problema?

Você precisa usar uma variável intermediária. O SQL Server não suporta esse tipo de operação na própria lista de parâmetros, embora ela esteja na lista TODO por alguns anos! (Veja o item Conectar: ​​Use as funções escalares como parâmetros do procedimento armazenado )

A gramática para EXEC é

 [ { EXEC | EXECUTE } ] { [ @return_status = ] { module_name [ ;number ] | @module_name_var } [ [ @parameter = ] { value | @variable [ OUTPUT ] | [ DEFAULT ] } ] [ ,...n ] [ WITH  [ ,...n ] ] } [;] 

A documentação atualmente não é clara em um formato aceitável para value mas parece ser apenas expressões “simples”, como valores literais ou funções de sistema @@ prefixadas (como @@IDENTITY ). Outras funções do sistema, como SCOPE_IDENTITY() não são permitidas (mesmo aquelas que não exigem parênteses, como CURRENT_TIMESTAMP não são permitidas).

Então, por enquanto, você precisa usar a syntax, como abaixo

 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 

Como apontado por Martin, o seguinte apenas se aplica a colunas e não a variables.

Note que eu alterei o seu casting para varchar(10) isso permitirá inteiros maiores que 1 dígito. varchar só permitirá 1 caractere

Você não pode fazer operações nos parâmetros de um procedimento armazenado. Você deve atribuir esse valor a outra variável e depois passá-la para o seu 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 

Talvez algo assim?

 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; 

Tente isso em vez disso …

 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; 

DECLARAR @id int

SET @id = 10

SELECIONAR LTRIM (RTRIM (STR (@id))) como stringValue