2009-08-08 3 views
31

Sto usando SQL Server 2008 Enterprise. Sto imparando il parametro OUTPUT della stored procedure SQL Server. Ad esempio, la stored procedure sp_add_jobschedule ha un parametro OUTPUT chiamato schedule_id.SQL Server uscita questione parametro

http://msdn.microsoft.com/en-us/library/ms366342.aspx

La mia confusione è, si presenta come parametro OUTPUT potrebbe essere fornito un valore di input e restituisce anche un valore, sembra che ha comportamenti sia di parametro di input e output? È permesso non fornire alcun valore INPUT per il parametro OUTPUT (per far sembrare che si tratti di puro comportamento dei parametri di output)?

risposta

60

La confusione è giustificato un grado - e altri RDBMS come Oracle non hanno parametri di stored procedure che possono essere di tipo IN (solo ingresso), OUT (solo uscita) oppure INOUT (entrambi i modi - tipo "passa per riferimento" del parametro).

SQL Server è un po 'sciatto qui sin dalla sua etichetta il parametro come OUTPUT, ma in realtà, questo significa INPUT/OUTPUT - è fondamentalmente solo significa che il proc memorizzato ha la possibilità di restituire un valore dalla sua richiesta in quel parametro.

Quindi sì - anche se si chiama OUTPUT parametro, è davvero più di un parametro INPUT/OUTPUT, e quelli IN, INOUT, OUT come in Oracle non esistono in SQL Server (in T-SQL).

+0

Grazie Marc, "La confusione è giustificato un certo grado - e di altri RDBMS come Oracle fare avere parametri stored procedure "- questo è solo il motivo per cui sono confuso. Sto migrando da DB2 a SQL Server. Molti concetti sono diversi. :-( – George2

+1

Un'ulteriore domanda, potremmo rendere il parametro OUTPUT come parametro opzionale, ovvero non potremmo fornire il suo valore di input e usarlo solo come output? – George2

+3

Sì, certo: potresti fornire il valore INPUT o lasciarlo vuoto - se non lo usi all'interno della procedura memorizzata, è totalmente inutile ciò che passi. Dipende da te e dal codice che scrivi nella tua procedura anche se non guardi il valore passato. La clausola "OUTPUT" vuol dire che la stored procedure ha la possibilità di restituire un valore in questo parametro - questo è tutto. –

19

posso darvi breve esempio su come creare stored procedure con parametri di uscita.

CREATE PROCEDURE test_proc 

@intInput int, 
@intOutput int OUTPUT 

AS 
set @intOutput = @intInput + 1 

go 

E per chiamare questa procedura e quindi utilizzare parametro di uscita fai come segue:

declare @intResult int 
exec test_proc 3 ,@intResult OUT 
select @intResult 

Si vede, che si dovrebbe dichiarare ouput prima variabile. E dopo aver eseguito la procedura memorizzata, il valore di uscita sarà nella variabile. È possibile impostare qualsiasi valore per la variabile di output, ma dopo aver eseguito la stored procedure conterrà esattamente quale restituzione della stored procedure (indipendentemente dal valore nella variabile di output).

Ad esempio:

declare @intResult int 
exec test_proc 3 ,@intResult OUT 
select @intResult 

Si tornerà 4. E:

declare @intResult int 
set @intResult = 8 
exec test_proc 3 ,@intResult OUT 
select @intResult 

tornare anche 4.

+1

Grazie, quindi parametro OUTPUT ha sia parametro di input e comportamenti dei parametri di uscita? – George2

+3

@ George2: Sì, il parametro OUTPUT funge da parametro di input e output. – shahkalpesh

2

La domanda è - perché vuoi per non consentire di fornire ingresso? Questo non ha assolutamente senso. Considerate questo semplice esempio:

CREATE PROCEDURE test (@param AS INT OUTPUT) AS 
BEGIN 
    SET @param = 100 
END 
GO 

DECLARE @i INT 
SET @i = 0 

EXECUTE test @i OUTPUT 
PRINT @i 

DROP PROCEDURE test 

Questo stampa

100 

Sede - come si fa ad ottenere un valore fuori se non metti una variabile in prima?

+0

Grazie Tomalak, non sono sicuro di poter progettare una procedura di archiviazione con parametro di output in questo modo. Posso trattare il parametro di output come parametro di input opzionale (perché il parametro di output ci consente di non inserire alcun valore) e come valore di ritorno? – George2

+1

Non sono sicuro di cosa sia così difficile da capire a riguardo. :) Qual è il problema attuale? – Tomalak

+0

Sto usando il parametro OUTPUT come parametro di input dell'opzione, non sono sicuro se sia corretto usare? Sto usando in questo modo, nella procedura di archiviazione, controllerò se il chiamante ha inserito valori per il parametro OUTPUT, se sì, farò qualcosa, se nessun valore di input per il parametro OUTPUT, farò qualcos'altro. – George2

2

Pensa ai PARAMETRI DI USCITA come passati per riferimento nei linguaggi di programmazione, è lo stesso. L'esempio migliore che posso pensare adesso è restituire il codice di errore. Vuoi qualche inserto ... se selezioni il codice di ritorno dall'SP devi recuperarlo nel tuo codice, con il parametro OUTPUT che non hai, sarà già nel tuo parametro (voglio dire usando i comandi C#, PHP init metodi memorizzati proc, o qualcosa di diverso stringhe quindi costruire)

+0

Grazie Svetlio, sembra che abbia comportamenti sia di parametro INPUT che OUTPUT? È permesso non fornire alcun valore INPUT per il parametro OUTPUT (per far sembrare che si tratti di puro comportamento dei parametri di output)? – George2

+2

@ George2: "È permesso non fornire alcun valore INPUT per il parametro OUTPUT (per farlo apparire come puro comportamento dei parametri di output)" - Non è quello che Sergey ha mostrato nel codice per esempio 1? – shahkalpesh

+0

Intendi questo? dichiarano @intResult int test_proc exec 3, @ intResult OUT selezionare @intResult – George2

5

Sì, è possibile utilizzare un parametro OUTPUT per il passaggio e il recupero di entrambi i valori (anche se non riesco a pensare a una buona ragione per farlo al momento).

Ecco un esempio banale che illustra questo:

-- The stored procedure 
CREATE PROCEDURE OutParamExample 
    @pNum int OUTPUT 
AS 
BEGIN 
    select @pNum 
    set @pNum = @pNum + 5 
END 
GO 

-- use a local variable to retrieve your output param value 
declare @TheNumber int 
set @TheNumber = 10 

print @TheNumber 
exec OutParamExample @TheNumber OUTPUT 
print @TheNumber 

I risultati sarà simile a questo:

10 

----------- 
10 

(1 row(s) affected) 

15 

EDIT: OK, penso che ho perso un "non" nella seconda paragrafo e potrebbe non aver risposto alla domanda che hai chiesto. Se si desidera un parametro di uscita rigida (ad esempio qualcosa di simile a un codice di ritorno), certamente non è necessario fornire un valorealla variabile locale passata come parametro di output, ma si devono ancora dichiarare che variabile locale in modo da Avremo un modo per accedere al valore restituito al di fuori dello scopo della procedura stessa.

Ad esempio:

declare @LocalNumber int 
-- I don't have to assign a value to @LocalNumber to pass it as a parameter 
exex OutParamExample @LocalNumber OUTPUT 
-- (assume SP has been altered to assign some reasonable value) 

-- but I do have to declare it as a local variable so I can get to 
-- the return value after the stored procedure has been called 
print @LocalNumber 
3

aggiunta ulteriore di quanto altri hanno detto sopra, i parametri di uscita può funzionare come ingresso nonché USCITA. Ma dipende dalla stored procedure per utilizzare il valore passato ad esso.

Se le stored procedure ignora il valore passato per il parametro OUTPUT (che dovrebbe avvenire in generale), il valore di ingresso viene ignorato in ogni caso.

Usando il codice di Sergey, posso utilizzare l'utente valore passato per @intOutput (se ho bisogno di)

create PROCEDURE test_proc 

@intInput int, 
@intOutput int OUTPUT 

AS 
set @intOutput = @intOutput + 1 

go 

Ma, che sconfigge lo scopo del parametro di uscita.
per dare una visione diversa, c forze # compilatore di sovrascrivere il valore del parametro da assegnazione (senza utilizzare il parametro di uscita).

ad es. Non posso farlo in C#. Qui agisce come solo parametro (cioè ignorare l'utente valore passato a questa funzione)

static void dosomething(out int i) 
{ 
    //i = 0; 
    i = i + 1; 
} 
1

Una nota aggiuntiva per quanto riguarda parte della domanda originale:

"E 'permesso di non fornire alcun input valori per il parametro OUTPUT (..)? "

In SQLServer è possibile specificare un valore predefinito per un parametro OUTPUT (che come altri hanno rilevato effettivamente INOUT). Si consideri il seguente esempio in cui è possibile specificare un valore esplicito o lasciare che la funzione stessa generano un ID.

CREATE PROCEDURE test (@id uniqueidentifier = NULL OUTPUT) AS 
BEGIN 
    IF @id IS NULL SET @id = NEWID() 
    -- INSERT INTO xyz (...) VALUES (@id, ...) 
    PRINT 'Insert with id: ' + CAST (@id as nvarchar(36)) 
END 
GO 

DECLARE @insertedId uniqueidentifier 
EXECUTE test '00000000-0000-0000-0000-000000000000' 
EXECUTE test @insertedId OUTPUT 
PRINT @insertedId 

DROP PROCEDURE test 

Questo stampa

Insert with id: 00000000-0000-0000-0000-000000000000 
Insert with id: 67AE3D27-8EAB-4301-B384-30EEA1488440 
67AE3D27-8EAB-4301-B384-30EEA1488440