Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Utiliser le résultat d'une expression (par exemple, un appel de fonction) dans une liste de paramètres de procédure stockée ?

Vous devez utiliser une variable intermédiaire. SQL Server ne prend pas en charge ce type d'opération dans la liste des paramètres elle-même, bien qu'elle figure sur la liste TODO depuis quelques années ! (Voir Connect Item :Utiliser des fonctions scalaires comme paramètres de procédure stockée)

La grammaire pour EXEC est

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

La documentation n'est actuellement pas aussi claire sur un format acceptable pour value mais il semble que ce ne soient que des expressions "simples" telles que des valeurs littérales ou @@ fonctions système préfixées (telles que @@IDENTITY ). Autres fonctions système telles que SCOPE_IDENTITY() ne sont pas autorisés (même ceux qui ne nécessitent pas de parenthèses comme CURRENT_TIMESTAMP ne sont pas autorisés).

Donc, pour le moment, vous devez utiliser une syntaxe telle que celle ci-dessous

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