none
inner join con procedimientos almacenados RRS feed

  • Pregunta

  • Hola. Acudo al foro esperando puedan apoyarme con esta duda.

    Tengo 4 procedimientos almacenados y de esos resultados quiero hacer un inner join. los procedimientos almacenados reciben los mismos tipos de parámetros pero con distintos valores. Espero me puedan ayudar. Gracias por la ayuda

    jueves, 27 de agosto de 2020 17:30

Todas las respuestas

  • Hola Pedro Bartolo:

    create procedure dbo.proc1 (@valor int)
    as
    begin
    	Select t.n, t.col1
    		from (values(1,'A'),(3,'C'),(4,'D'),(5,'E'))T(n, col1);
    end
    GO
    create procedure dbo.proc2 (@valor int)
    as
    begin
    
    	Select t.n, t.col1,col2
    		from (values(1,'A','a'),(2,'B','b'),(3,'C','c'),(4,'D','d'),(5,'E','e'))T(n, col1,col2);
    end
    GO
    create procedure dbo.proc3 (@valor int)
    as
    begin
    	Select t.n, t.col1,col2, col3 
    		from (values(1,'A','a',0),(3,'C','c',2),(4,'D','d',2),(5,'E','e',1))T(n, col1,col2,col3);
    end
    GO
    create procedure dbo.proc4 (@valor int)
    as
    begin
    
    	Select t.n, t.col1,col2
    		from (values(1,'A','a'),(2,'B','b'),(3,'C','c'),(5,'E','e'))T(n, col1,col2);
    end
    GO

    El contenido de los procedimientos y los parámetros son cajas negras para aplicar una query a su resultado.

    El el ejemplo que te expongo, cada procedimiento devuelve un conjunto de resultados de 1 fila y varios tipos de columnas 

    exec dbo.proc1 1;
    exec dbo.proc2 2;
    exec dbo.proc3 3;
    exec dbo.proc4 4;


    Pero una variable tipo tabla se puede llenar con el result de un procedure.

    -- para dbo.proc1
    declare @table1 table (col int, valor char(1));
    -- para dbo.proc1
    declare @table2 table (col int, valor char(1), valor2 char(1));
    -- para dbo.proc1							   
    declare @table3 table (col int, valor char(1), valor2 char(1), valor3 int);
    -- para dbo.proc4
    declare @table4 table (col int, valor char(1), valor2 char(1));
    Insert into @table1
    exec dbo.proc1 1;
    Insert into @table2
    exec dbo.proc2 1;
    Insert into @table3
    exec dbo.proc3 1;
    Insert into @table4
    exec dbo.proc4 1;
    
    Select t1.col, t1.valor, t2.valor2, t3.valor3, t4.valor2	
    	from @table1 t1 inner join @table2 t2 on t1.col = t2.col
    					inner join @table3 t3 on t1.col = t3.col
    					inner join @table4 t4 on t1.col = t4.col

    Insertando en cada variable de tipo tabla los valores que retorna cada uno de los procedures, y luego en una consulta se tratan como tablas.

    jueves, 27 de agosto de 2020 17:47
  • Te estoy muy agradecido Javi, así lo estoy haciendo. Aprovechando tu asesoría. Sabes si existe la forma de que al momento de crear mi tabla pueda usar como nombre de la columna una variable? Lo intento pero me marca error por la sintaxis.

    Create table proc1(

    @col1,@col2

    )

    las columnas las obtengo a través de los almacenes que me retorna otra consulta. Mis variables @col ya tienen los nombres de almacenes, me falta crear el nombre de la columna con una variable. Gracias

    Sakludos

    jueves, 27 de agosto de 2020 20:54
  • Con el permiso de Javi, tal vez podría resolverse mediante un query dinámico

    IIslas Master Consultant SQL Server

    jueves, 27 de agosto de 2020 22:38