sql >> Base de Datos >  >> RDS >> Sqlserver

¿Usando el resultado de una expresión (por ejemplo, llamada de función) en una lista de parámetros de procedimiento almacenado?

Necesitas usar una variable intermedia. SQL Server no admite este tipo de operación en la lista de parámetros, aunque ha estado en la lista TODO durante algunos años. (Consulte Elemento de conexión:Usar funciones escalares como parámetros de procedimientos almacenados)

La gramática para EXEC es

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

Actualmente, la documentación no es tan clara sobre un formato aceptable para value pero parece ser solo expresiones "simples" como valores literales o @@ funciones del sistema prefijadas (como @@IDENTITY ). Otras funciones del sistema como SCOPE_IDENTITY() no están permitidos (incluso aquellos que no requieren paréntesis como CURRENT_TIMESTAMP no están permitidos).

Entonces, por el momento, debe usar una sintaxis como la siguiente

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