2009-09-18 4 views
12
CREATE PROCEDURE [test].[proc] 
@ConfiguredContentId int, 
@NumberOfGames int 
AS 
BEGIN 
SET NOCOUNT ON 
RETURN 
@WunNumbers TABLE (WinNumb int) 

    INSERT INTO @WunNumbers (WinNumb) 
SELECT TOP (@NumberOfGames) WinningNumber 
FROM [Game].[Game] g 
JOIN [Game].[RouletteResult] AS rr ON g.[Id] = rr.[gameId] 
WHERE g.[ConfiguredContentId] = @ConfiguredContentId 
ORDER BY g.[Stoptime] DESC 

SELECT WinNumb, COUNT (WinNumb) AS "Count" 
FROM @WunNumbers wn 
GROUP BY wn.[WinNumb] 
END 
GO 

Questa stored procedure restituisce i valori dalla prima istruzione select, ma vorrei che i valori della seconda istruzione select vengano restituiti. Table @WunNumbers è una tabella temporanea.Come restituire la tabella temporanea dalla stored procedure

Qualche idea ???

+0

perfavore riformattare il codice sql. –

+0

Questo codice non è valido SQL. Potrebbe essere, se "RETURN @WinNumbers" fosse "DECLARE @WinNumbers", ma poi il resto di esso sembra giusto per restituire il set di risultati finali –

+0

vedo ora, ho pubblicato il codice sbagliato. C'è "DECLARE @WinNumbers" ma non funziona ancora. – dani

risposta

6

Quale versione di SQL Server si sta utilizzando? In SQL Server 2008 è possibile utilizzare Table Parameters and Table Types.

Un approccio alternativo consiste nel restituire una variabile di tabella da una funzione definita dall'utente, ma non sono un grande fan di questo metodo.

È possibile trovare un esempio here

+0

Sto utilizzando SQL Server 2005 – dani

25

Date un'occhiata a questo codice,

CREATE PROCEDURE Test 

AS 
    DECLARE @tab table (no int, name varchar(30)) 

    insert @tab select eno,ename from emp 

    select * from @tab 
RETURN 
+0

Come restituire/restituire una variabile di tabella al chiamante? Attualmente restituisce un set di risultati. –

+3

Restituisce il risultato dell'istruzione select (domanda effettiva) che in questo caso è il contenuto della variabile di tabella locale @tab. – JeffO

+5

se eseguo 'EXECUTE Test' come posso accedere a @tab? – whytheq

0

Il tipo di ritorno di una procedura è int.

È inoltre possibile restituire set di risultati (come il codice fa attualmente) (ok, è anche possibile inviare messaggi, che sono stringhe)

Quelli sono l'unico "restituisce" si può fare. Mentre puoi aggiungere parametri con valori di tabella a una procedura (vedi BOL), sono solo input.

Edit:

(O come un altro poster accennato, è anche possibile utilizzare una tabella funzione valutata, piuttosto che una procedura)

2

una tabella temporanea può essere creato in chiamante e poi popolata da il chiamato SP.

create table #GetValuesOutputTable(
    ... 
); 

    exec GetValues; -- populates #GetValuesOutputTable 

    select * from #GetValuesOutputTable; 

Alcuni vantaggi di questo approccio rispetto al "exec inserto" è che può essere annidato e che può essere utilizzato come ingresso o uscita.

Alcuni svantaggi sono che "argomento" non è pubblico, la creazione della tabella esiste all'interno di ogni chiamante e che il nome della tabella potrebbe entrare in collisione con altri oggetti temporanei. È utile quando il nome della tabella temporanea corrisponde strettamente al nome SP e segue alcune convenzioni.

Prendendo un po 'più lontano, per l'output solo tabelle temporanee, l'approccio insert-exec e l'approccio alla tabella temporanea possono essere supportati simultaneamente dal chiamato SP. Questo non aiuta troppo a concatenare gli SP perché la tabella deve ancora essere definita nel chiamante, ma può aiutare a semplificare i test dalla linea cmd o quando si chiama esternamente.

-- The "called" SP 
    declare 
     @returnAsSelect bit = 0; 

    if object_id('tempdb..#GetValuesOutputTable') is null 
    begin 
     set @returnAsSelect = 1; 
     create table #GetValuesOutputTable(
     ... 
    ); 
    end 

    -- populate the table 

    if @returnAsSelect = 1 
     select * from #GetValuesOutputTable; 
0

SI PUOI.

Nella procedura memorizzata, si compila la tabella @tbRetour.

Alla fine della vostra stored procedure, si scrive:

SELECT * FROM @tbRetour 

Per eseguire la stored procedure, si scrive:

USE [...] 
GO 

DECLARE @return_value int 

EXEC @return_value = [dbo].[getEnregistrementWithDetails] 
@id_enregistrement_entete = '(guid)' 

GO 
0

Innanzitutto creare un vero e proprio, tavolo permanente come un modello che ha il layout richiesto per la tabella temporanea restituita, utilizzando una convenzione di denominazione che la identifica come modello e la collega simbolicamente all'SP, ad esempio tmp_SPName_Output. Questa tabella non conterrà mai dati.

Nell'SP, utilizzare INSERT per caricare i dati in una tabella temporanea seguendo la stessa convenzione di denominazione, ad es. #SPName_Output che si presume esistano. È possibile verificare la sua esistenza e restituire un errore in caso contrario.

Prima di chiamare l'uso sp questa semplice selezionare per creare la tabella temporanea:

SELECT TOP(0) * INTO #SPName_Output FROM tmp_SPName_Output; 
EXEC SPName; 
-- Now process records in #SPName_Output; 

Questo ha questi vantaggi:

  • La tabella temporanea è locale per la sessione corrente, a differenza di ## , quindi non si scontrerà con chiamate simultanee al SP da sessioni diverse. Viene inoltre rilasciato automaticamente quando non rientra nell'ambito.
  • La tabella dei modelli viene mantenuta insieme all'SP, quindi se le modifiche apportate all'output sono (aggiunte nuove colonne, ad esempio), i chiamanti dell'SP non vengono interrotti. Il chiamante non ha bisogno di essere cambiato.
  • È possibile definire un numero qualsiasi di tabelle di output con denominazione diversa per un SP e riempirle tutte. È inoltre possibile definire uscite alternative con nomi diversi e fare in modo che l'SP verifichi l'esistenza delle tabelle temporanee per vedere quali devono essere riempite.
  • Allo stesso modo, se grandi cambiamenti sono fatti, ma si desidera mantenere a ritroso compatibilità, si può avere una nuova tabella modello e la denominazione per la versione successiva ma continuano a sostenere la versione precedente, controllando che la temp tavolo il chiamante ha creato.