Usuario
Error al insertar en tabla temporal desde Procedimiento Almacenado

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
Todas las respuestas
-
Hola Pedro Bartolo:
En esta entrada de stackOverflow, tienes detallado el problema y algunas posibles soluciones.
-
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