Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

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


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 esteja na lista TODO há alguns anos! (Consulte Connect Item:Use funções escalares como parâmetros de procedimento armazenado)

A gramática para EXEC é
[ { EXEC | EXECUTE } ]
    { 
      [ @return_status = ]
      { module_name [ ;number ] | @module_name_var } 
        [ [ @parameter = ] { value 
                           | @variable [ OUTPUT ] 
                           | [ DEFAULT ] 
                           }
        ]
      [ ,...n ]
      [ WITH <execute_option> [ ,...n ] ]
    }
[;]

A documentação atualmente não é tã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 permitidos (mesmo aqueles que não requerem parênteses como CURRENT_TIMESTAMP não é permitido).

Então, por enquanto, você precisa usar sintaxe como a 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