Usando il risultato di un’espressione (ad es. Chiamata di funzione) in un elenco di parametri di stored procedure?

Sto cercando di scrivere una stored procedure per aiutare lo sviluppo del nostro database, ma ho qualche problema ad usarlo. Per esempio:

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

Questo produce l’errore (su SQL Server 2005)

Messaggio 102, livello 15, stato 1, riga 4 syntax errata vicino a ‘+’.

Qualcuno può spiegarmi perché la mia syntax non è corretta e il modo giusto per risolvere questo problema?

Devi usare una variabile intermedia. SQL Server non supporta questo tipo di operazione nell’elenco dei parametri stesso sebbene sia presente nell’elenco TODO per alcuni anni! (Vedi Collega elemento: usa le funzioni scalari come parametri della procedura memorizzata )

La grammatica per EXEC è

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

La documentazione non è attualmente chiara su un formato accettabile per il value ma sembra essere solo espressioni “semplici” come valori letterali o funzioni di sistema con prefisso @@ (come @@IDENTITY ). Altre funzioni di sistema come SCOPE_IDENTITY() non sono consentite (anche quelle che non richiedono parentesi come CURRENT_TIMESTAMP non sono consentite).

Quindi per il momento è necessario utilizzare la syntax come il seguente

 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 

Come sottolineato da Martin, quanto segue si applica solo alle colonne non alle variabili.

Notare che ho modificato il cast in varchar(10) per consentire numeri interi superiori a 1 cifra. varchar consentirà solo 1 carattere

Non è ansible eseguire operazioni sui parametri di una stored procedure. Dovresti assegnare quel valore su un’altra variabile e poi passarlo al tuo 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 

Forse qualcosa del genere?

 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; 

Prova questo invece …

 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; 

DICHIARO @id int

SET @id = 10

SELECT LTRIM (RTRIM (STR (@id))) AS stringValue