none
Error al insertar en tabla temporal desde Procedimiento Almacenado RRS feed

  • Pregunta

  • Hola buen día a todos. Tengo un problema con mis procedimientos almacenados espero me puedan asesorar. Tengo varios procedimientos almacenados, los cuales son llamados desde otros procedimientos almacenados, en el cual almaceno en tablas temporales, mismos que son llamados en un último procedimiento almacenado donde también la información es almacenada en tablas temporales para finalmente hacer left join con los resultados. He combinado con variables de tabla per me sigue enviando errorres. Agrego mi código y el error:

    alter PROCEDURE [dbo].[VentasAnualesClasificacionConcentrado]
    @Clasificacion int,
    @almacen int,
    @cIdClasificacion int
    as
    
    IF Object_ID ('tempDB..#VentaAnualCU', 'U') is not null 
    DROP TABLE #VentaAnualCU;
    CREATE TABLE #VentaAnualCU (ClaveProducto VARCHAR(30),
    Mes1 int,
    Mes2 int,
    Mes3 int
    )
    IF Object_ID ('tempDB..#VentaAnualCM', 'U') is not null 
    DROP TABLE #VentaAnualCM;
    CREATE TABLE #VentaAnualCM (ClaveProducto VARCHAR(30), 
    Mes1 int,
    Mes2 int,
    Mes3 int,
    )
    
    Insert into #VentaAnualCU 
    exec [VentasAnualesClasificacion] @Clasificacion,@almacen,@cIdClasificacion
    
    
    Insert into #VentaAnualCM 
    exec [VentasAnualesClasificacionMovimientos] @Clasificacion,@almacen,@cIdClasificacion
    
    
    select 
    VAU.CCODIGOPRODUCTO, 
    VAU.Mes1,VAM.Mes1 as MesM1,
    VAU.Mes2,VAM.Mes2 as MesM2,
    VAU.Mes3,VAM.Mes3 as MesM3,
    
    from #VentaAnualCU VAU left join #VentaAnualCM VAM on VAU.ClaveProducto =VAM.ClaveProducto 
    
    

    La consulta me arroja el siguiente error:

    An insert Exec Statement Cannot be nested

    En los Procedimientos almacenados : VentasAnualesClasificacion y VentasAnualesClasificacionMovimientos también hago uso de algo similar que en este procedimiento, donde llamo a otros procedimientos y creo tablas temporales sobre las cuales aplico inner y left join que incluso ahí no me marca error sino hasta este procedimiento. Gracias por la ayuda. Saludos cordiales

    domingo, 6 de septiembre de 2020 0:12

Todas las respuestas

  • Hola Pedro Bartolo:

    En esta entrada de stackOverflow, tienes detallado el problema y algunas posibles soluciones.

    https://es.stackoverflow.com/questions/76005/error-an-insert-exec-statement-cannot-be-nested-sql-server-2008-r2

    domingo, 6 de septiembre de 2020 6:39
  • Hola Pedro Bartolo:

    Además, tienes errores de sintaxis en el procedure.

    select VAU.CCODIGOPRODUCTO, VAU.Mes1,VAM.Mes1 as MesM1, VAU.Mes2,VAM.Mes2 as MesM2, VAU.Mes3,VAM.Mes3 as MesM3,

    No existe la columna VAU.CCODIGOPRODUCTO

    Después de MesM3 hay una coma que no es válida.

    Supongo que es asunto del copia pega, pero tenlo en cuenta.

    No obstante, con tú código.

    create procedure dbo.[VentasAnualesClasificacion](
      @Clasificacion int
    , @almacen int
    , @cIdClasificacion int
    )as
    begin
    	select t.ClaveProducto, t.Mes1, t.Mes2, t.Mes3 FROM (Values(1,10,12,13))T(ClaveProducto, Mes1, Mes2, Mes3)
    end
    go
    create procedure dbo.[VentasAnualesClasificacionMovimientos](
      @Clasificacion int
    , @almacen int
    , @cIdClasificacion int
    )as
    begin
    	select t.ClaveProducto, t.Mes1, t.Mes2, t.Mes3 FROM (Values(1,10,12,13))T(ClaveProducto, Mes1, Mes2, Mes3)
    end
    go
    -- Los dos procedures devuelve una fila 

    La modificación del tuyo.

    create PROCEDURE [dbo].[VentasAnualesClasificacionConcentrado]
    @Clasificacion int,
    @almacen int,
    @cIdClasificacion int
    as
    begin
    IF Object_ID ('tempDB..#VentaAnualCU', 'U') is not null 
    DROP TABLE #VentaAnualCU;
    CREATE TABLE #VentaAnualCU (ClaveProducto VARCHAR(30),
    Mes1 int,
    Mes2 int,
    Mes3 int
    )
    IF Object_ID ('tempDB..#VentaAnualCM', 'U') is not null 
    DROP TABLE #VentaAnualCM;
    CREATE TABLE #VentaAnualCM (ClaveProducto VARCHAR(30), 
    Mes1 int,
    Mes2 int,
    Mes3 int,
    )
    
    Insert into #VentaAnualCU 
    exec [VentasAnualesClasificacion] @Clasificacion,@almacen,@cIdClasificacion
    
    
    Insert into #VentaAnualCM 
    exec [VentasAnualesClasificacionMovimientos] @Clasificacion,@almacen,@cIdClasificacion
    
    select 
    VAU.ClaveProducto, 
    VAU.Mes1,VAM.Mes1 as MesM1,
    VAU.Mes2,VAM.Mes2 as MesM2,
    VAU.Mes3,VAM.Mes3 as MesM3
    
    from #VentaAnualCU VAU left join #VentaAnualCM VAM on VAU.ClaveProducto =VAM.ClaveProducto 
    end
    go

    Y la ejecución

    exec [VentasAnualesClasificacionConcentrado] 1,1,1

    --- Una prueba más completa. 

    drop procedure if exists dbo.VentasAnualesClasificacion;
    drop procedure if exists dbo.VentasAnualesClasificacionMovimientos;
    drop procedure if exists dbo.[VentasAnualesClasificacionConcentrado];
    go

    Ahora creo los procedures, también con tablas temporales.

    create procedure dbo.[VentasAnualesClasificacion](
      @Clasificacion int
    , @almacen int
    , @cIdClasificacion int
    )as
    begin
    drop table if exists #myTemp; -- Sql 2016
    
    Create table #myTemp  (claveProducto int, Mes1 int, Mes2 int, Mes3 int)
    Insert into #myTemp
    	select t.ClaveProducto, t.Mes1, t.Mes2, t.Mes3 FROM (
    		Values (1,10,12,13),
    			   (2,10,12,13),
    			   (3,10,12,13)
    		)
    		T(ClaveProducto, Mes1, Mes2, Mes3);
    
    Select * from #myTemp;
    
    end
    go
    create procedure dbo.[VentasAnualesClasificacionMovimientos](
      @Clasificacion int
    , @almacen int
    , @cIdClasificacion int
    )as
    begin
    drop table if exists #myTemp; -- Sql 2016
    
    Create table #myTemp  (claveProducto int, Mes1 int, Mes2 int, Mes3 int)
    Insert into #myTemp
    	select t.ClaveProducto, t.Mes1, t.Mes2, t.Mes3 FROM (
    		Values (1,10,12,13),
    			   (2,10,12,13)
    		)
    		T(ClaveProducto, Mes1, Mes2, Mes3);
    
    Select * from #myTemp;
    end
    go
    -- Los dos procedures devuelve una fila 
    create PROCEDURE [dbo].[VentasAnualesClasificacionConcentrado]
    @Clasificacion int,
    @almacen int,
    @cIdClasificacion int
    as
    begin
    IF Object_ID ('tempDB..#VentaAnualCU', 'U') is not null 
    DROP TABLE #VentaAnualCU;
    CREATE TABLE #VentaAnualCU (ClaveProducto VARCHAR(30),
    Mes1 int,
    Mes2 int,
    Mes3 int
    )
    IF Object_ID ('tempDB..#VentaAnualCM', 'U') is not null 
    DROP TABLE #VentaAnualCM;
    CREATE TABLE #VentaAnualCM (ClaveProducto VARCHAR(30), 
    Mes1 int,
    Mes2 int,
    Mes3 int,
    )
    
    Insert into #VentaAnualCU 
    exec [VentasAnualesClasificacion] @Clasificacion,@almacen,@cIdClasificacion
    
    
    Insert into #VentaAnualCM 
    exec [VentasAnualesClasificacionMovimientos] @Clasificacion,@almacen,@cIdClasificacion
    
    select 
    VAU.ClaveProducto, 
    VAU.Mes1,VAM.Mes1 as MesM1,
    VAU.Mes2,VAM.Mes2 as MesM2,
    VAU.Mes3,VAM.Mes3 as MesM3
    
    from #VentaAnualCU VAU left join #VentaAnualCM VAM on VAU.ClaveProducto =VAM.ClaveProducto 
    end
    go
    

    Y ahora la ejecución:

    exec dbo.[VentasAnualesClasificacionConcentrado] 1,1,1

    El resultado de ejecución es correcto. En el primer procedure, se insertan filas en la tabla temporal para 3 códigos, en el segundo 2 y en el último, leyendo los resultados de los mismos, se realiza el left join correctamente.

    • Editado Javi Fernández F domingo, 6 de septiembre de 2020 7:23 Detallar más las pruebas
    domingo, 6 de septiembre de 2020 6:50