2011-12-29 4 views
7

ho una stored procedure seguenteCome si combinano set di risultati da due chiamate di stored procedure?

CREATE PROCEDURE [dbo].[MyStored] 
    @state int 
AS 
    SELECT blahblahblah WHERE [email protected] LotsOfJoinsFollow; 
RETURN 0 

e mi piacerebbe chiamare quel stored procedure con @state essere 0 e 1 ed avere i set di risultati restituiti da entrambe le chiamate in combinazione con UNION semantica in modo da avere un nuovo set di risultati con righe sia dalla prima che dalla seconda chiamata.

Qualcosa di simile (SQL immaginario):

(EXEC MyStored 0) UNION (EXEC MyStored 1); 

Come posso ottenere che?

+0

Stai bene con lo stato @ essere un elenco delimitato da virgole? (ad esempio, stato = '0,1') - la soluzione è diversa a seconda della risposta. –

+0

@Ray K: Non sono sicuro, preferirei una soluzione facile da mantenere. – sharptooth

+2

duplicato: http://stackoverflow.com/questions/5292069/union-the-results-of-multiple-stored-procedures – goric

risposta

12

Questo può essere banalizzando il problema, ma se si ha il controllo sulla sp, basta usare in anziché =:

CREATE PROCEDURE [dbo].[MyStored] 
AS 
    SELECT blahblahblah WHERE StoredState IN (0,1) LotsOfJoinsFollow; 
RETURN 0 

Se questo non è un'opzione, basta spingere i risultati di entrambi sproc chiamate in una tabella temporanea:

/*Create a table with the same columns that the sproc returns*/ 
CREATE TABLE #tempblahblah(blahblahblah NVARCHAR(50)) 

INSERT #tempblahblah (blahblahblah) 
EXEC MyStored 0 

INSERT #tempblahblah (blahblahblah) 
EXEC MyStored 1 

SELECT * FROM #tempblahblah
1

Un modo lungo sarebbe creare un wrapper che esegue questa operazione, una funzione che prende un elenco di stati e li aggiunge a una tabella finale che verrebbe restituita.

Si potrebbe anche avere tutto ciò che la tecnologia sta chiamando questa procedura fare il concatination di record (persone che hanno .NET aggiungere il set di risultati di ogni stato si sta cercando in)

Se stai bene con il passaggio in una lista di stati al tuo parametro 'stato', è possibile creare una query sql dinamica

CREATE PROCEDURE [dbo].[MyStored] 
    @state nvarchar(150) 
AS 

-- @state needs to be pre-formatted in a list for an in-clause 
-- i.e. 1,2,10 (if it was a string list, you'd need to do use double single quotes around the items - ''1'',''2'',''10'' 

DECLARE @SQL nVarChar(5000) = ' 
    SELECT blahblahblah 
    FROM LotsOfJoins 
    WHERE StoredState in (' + @state + ')' 


exec sp_executeSql @sql 

Questo funziona perfettamente per procedure semplici; sebbene, può richiedere più tempo per mantenere se le modifiche sono necessarie lungo la strada.

.

Ecco un CodeProject Article e un MS SQL Tips Article che fa un lavoro migliore di entrare nei dettagli

.

EDIT: Il @state param dovrà essere un nVarChar dal vostro passaggio in un elenco delimitato da virgole di valori int

5
create table #table ( 
    ..... 
) 

insert into #table exec MyStored 0 
insert into #table exec MyStored 1 

select * from #table 

drop table #table 
3

alternativa ad una serie di dichiarazioni come queste:

INSERT INTO #YourTempTable 
EXEC MyStored 0; 
INSERT INTO #YourTempTable 
EXEC MyStored 1; 

è possibile utilizzare uno INSERT ... EXEC dichiarazione come di seguito:

INSERT INTO #YourTempTable 
EXEC (' 
    EXEC MyStored 0; 
    EXEC MyStored 1; 
'); 

I risultati delle due chiamate a MyStored sarebbe UNIONed (o, meglio , UNION ALLed), proprio come con il precedente metodo.

0

Se la procedura memorizzata che si sta chiamando ha una tabella temporanea con lo stesso nome di una nella procedura di chiamata, si otterrà questo errore.

ad es.sp1 ha tabella temporanea #risultati

sp2 crea tabella #risultati (campi) quindi cercando di inserire in #risultati in sp2 il risultato della chiamata sp1 fallirebbe con questo errore. cambia la tabella temporanea in sp2 a #result e riprova e dovresti vedere ora funziona.