2011-12-29 15 views
7

tengo un procedimiento almacenado siguiente¿Cómo combino los conjuntos de resultados de dos llamadas a procedimientos almacenados?

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

y me gustaría llamar a ese procedimiento almacenado con ser @state 0 y 1 y tienen los conjuntos de resultados devueltos por las llamadas combinados con UNION la semántica de modo que tenga una nuevo conjunto de resultados que tiene filas tanto de la primera como de la segunda llamada.

Algo así como SQL (imaginaria):

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

¿Cómo lograrlo?

+0

¿Está de acuerdo con que @state sea una lista delimitada por comas? (por ejemplo, estado = '0,1'): la solución es diferente dependiendo de su respuesta. –

+0

@Ray K: No estoy seguro, preferiría una solución fácil de mantener. – sharptooth

+2

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

Respuesta

12

Esto se puede simplificando el problema, pero si usted tiene el control sobre el sp, sólo tiene que utilizar en en lugar de: =

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

Si esto no es una opción, basta con pulsar los resultados de ambos sproc llamadas en una tabla temporal:

/*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 largo camino sería crear un contenedor que hace esto - una función que toma una lista de estados y los agrega a una tabla final que sería devuelta.

También podría tener cualquier tecnología que está llamando a este procedimiento haga el concatenar los registros (es decir, tener .NET anexar el conjunto de resultados de cada estado en el que está buscando en)

Si usted está muy bien con el paso en una lista de estados a su parámetro 'estado', puede crear una consulta SQL dinámica

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 

Esto funciona muy bien para procedimientos simples; sin embargo, puede tomar más tiempo para mantener si se necesitan cambios en el futuro.

.

Aquí es una CodeProject Article y una MS SQL Tips Article que hace un mejor trabajo de entrar en detalles

.

EDIT: El @state parámetro tendrá que ser un nVarChar desde su fallecimiento en una lista separada por comas de valores int

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

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

select * from #table 

drop table #table 
3

Como alternativa a una serie de afirmaciones como éstas:

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

usted podría utilizar uno INSERT ... EXEC declaración, como a continuación:

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

Los resultados de las dos llamadas a MyStored sería unioned (o, más bien , UNION ALLed), al igual que con el método anterior.

0

Si el procedimiento almacenado al que llama tiene una tabla temporal con el mismo nombre que uno en el procedimiento de llamada, obtendrá este error.

p. Ej.sp1 tiene mesa temporal #resultados

sp2 create table #results (fields) luego tratando de insertar en #results in sp2 el resultado de llamar a sp1 fallaría con este error. Cambia la tabla temporal en sp2 a #result e intenta nuevamente y deberías ver que esto ahora funciona.

Cuestiones relacionadas