2011-02-08 7 views
12

Sto provando a scrivere una stored procedure per aiutare lo sviluppo del nostro database, ma ho qualche problema ad usarlo. Per esempio:Utilizzo del risultato di un'espressione (ad esempio chiamata di funzione) in un elenco di parametri della procedura memorizzato?

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)

Msg 102, livello 15, stato 1, riga 4 sintassi corretta accanto a '+'.

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

risposta

18

È necessario utilizzare 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! (Vedere Connect Item: Use scalar functions as stored procedure parameters)

Il grammar for EXEC è

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

La documentazione non è attualmente chiaro in un formato accettabile per value ma sembra essere solo espressioni "semplici" come valori letterali o @@ funzioni di sistema prefissati (ad esempio @@IDENTITY). Altre funzioni di sistema come SCOPE_IDENTITY() non sono consentite (anche quelle che non richiedono parentesi come CURRENT_TIMESTAMP non sono consentite).

Così, per il momento, è necessario utilizzare la sintassi, come le sottostanti

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 
+3

Speravo di evitare variabili intermedie. C'è un modo corretto per farlo senza introdurli? – WorkerThread

+0

Ah, ho appena visto la tua spiegazione. Grazie per aver chiarito questo. – WorkerThread

+0

@Worker - È un po 'fastidioso. MS riconosciamo come molto qui https://connect.microsoft.com/SQLServer/feedback/details/352110/t-sql-use-scalar-functions-as-stored-procedure-parameters –

2
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, il seguente è valida solo per non colonne variabili.

Nota che ho modificato il cast a varchar(10) questo permetterà per interi più grandi di 1 cifra. varchar consente solo 1 carattere

+1

@Barry - Questo è vero per una colonna, ma il valore predefinito per una variabile 'varchar' è 10.' select CAST ('1234567890' come varchar) '. Hai bisogno di '11' anche se per la gamma completa di' int' se vuoi consentire i negativi. –

+0

@ Martin - beh, non lo sapevo. Grazie per la segnalazione. Sai perché il comportamento è diverso? – codingbadger

+0

@Barry - No - mi sembra un bel incoerenza sconcertante. Immagino che ci sia probabilmente un motivo storico ... –

1

Non si può fare 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 
0

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; 
0

Prova a modificare la ...

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; 
0

DECLARE @id int

SET @ id = 10

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

Problemi correlati