Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Verwenden des Ergebnisses eines Ausdrucks (z. B. Funktionsaufruf) in einer Parameterliste einer gespeicherten Prozedur?

Sie müssen eine Zwischenvariable verwenden. SQL Server unterstützt diese Art von Operation in der Parameterliste selbst nicht, obwohl sie seit einigen Jahren auf der TODO-Liste steht! (Siehe Connect Item:Skalarfunktionen als gespeicherte Prozedurparameter verwenden)

Die Grammatik für EXEC ist

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

Die Dokumentation ist derzeit nicht so klar in Bezug auf ein akzeptables Format für value aber es scheinen nur "einfache" Ausdrücke wie Literalwerte oder @@ zu sein vorangestellte Systemfunktionen (wie @@IDENTITY ). Andere Systemfunktionen wie SCOPE_IDENTITY() sind nicht zulässig (auch solche, die keine Klammern erfordern, wie CURRENT_TIMESTAMP sind nicht erlaubt).

Daher müssen Sie vorerst eine Syntax wie die folgende verwenden

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