none
Problema con un insert exec RRS feed

  • Pregunta

  • Hola a todos

    tengo el siguiente problema sucede que tengo un procedimiento , que quiero reutilizar unos valores que regresa , pero lo quiero guardar en una tabla temporal o fisica,  sucede que almomento de ejecutar y guarda en una tabla temporal me sale el famoso An INSERT EXEC statement cannot be nested.

    DECLARE 

    @cliente INT,
    @region varchar(100),
    @fecIni DATETIME,
    @fecFin DATETIME


    SET @cliente = 118
    SET @region = '3'
    SET @fecIni = '2019-10-13 00:00:00'
    SET @fecFin = '2019-10-14 23:59:59'


    DECLARE TABLE #TEMP 
    (
    id int,
     Nombre varchar(250),
     Name varchar(20),
    valor numeric(12,4),
    columnNameEsp varchar(30),
    columnNameEng varchar(30),
    numOrder int
    )

         

         INSERT INTO #Temp

         EXEC SP_Reporte

     

    Se los agradeceria de antemano una posible solucion


    Pregunta

    jueves, 24 de octubre de 2019 18:12

Respuestas

  • Hola, mira encontré estos links..puede que sean de ayuda.

    link1

    link2

    link3

    Saludos.

    • Marcado como respuesta Dave2203 jueves, 24 de octubre de 2019 19:43
    jueves, 24 de octubre de 2019 18:15
  • Hola Dave2203:

    Si quieres una tabla temporal tendrás que realizar un drop antes.

    Pero puedes cambiarlo tambíen por una variable de tabla.

    DECLARE 
    
    @cliente INT,
    @region varchar(100),
    @fecIni DATETIME,
    @fecFin DATETIME;
    
    
    SET @cliente = 118;
    SET @region = '3';
    SET @fecIni = '2019-10-13 00:00:00';
    SET @fecFin = '2019-10-14 23:59:59';
    
    
    DECLARE @temp TABLE 
    (
    id int,
     Nombre varchar(250),
     Name varchar(20),
    valor numeric(12,4),
    columnNameEsp varchar(30),
    columnNameEng varchar(30),
    numOrder int
    );
    
         
    
    INSERT INTO @TEMP (ID, NOMBRE, NAME, VALOR,
    COLUMNNAMEESP, COLUMNNAMEENG, NUMORDER)
    
         EXEC SP_Reporte;

    • Marcado como respuesta Dave2203 jueves, 24 de octubre de 2019 19:43
    jueves, 24 de octubre de 2019 18:18
  • Hola Dave2203:

    create procedure sp_reporte 
    as
    begin
    	select 1 as valor;
    	return
    end
    GO
    declare @table table(valor int)
    insert into @table (valor)
    exec sp_reporte

    (1 row affected)

    Completion time: 2019-10-24T21:04:02.9552842+02:00

    ¿Que devuelve tu sp_report?

    ¿Cuantas columnas y de que tipo?

    • Marcado como respuesta Dave2203 jueves, 24 de octubre de 2019 19:43
    jueves, 24 de octubre de 2019 19:05
  • Return finaliza un procedure si o si. Si pones instrucciones después no las ejecuta aunque esten dentro de un BEGIN END.

    Se puede devolver un int, con el return a modo de estado.

    Yo personalmente considero que es una buena praxis utiliazar return para cerrar el procedure y por ende la transacción.

    Si no pones un int, para la devolución, retorna 0 y "todas las aplicaciones del mundo" consideran que algo invocado cuando retorna 0 es una ejecución correcta. Pero es válido retornar otro valor.

    Return

    https://docs.microsoft.com/es-es/sql/t-sql/language-elements/return-transact-sql?view=sql-server-ver15#return-types

    Un simple ejemplo

    create or alter procedure sp_reporte 
    as
    begin
    	return 1;
    end
    GO
    declare @retorno int;
     exec @retorno = sp_reporte;
    select @retorno
    
    -----------
    1

    (1 row affected)
    Completion time: 2019-10-24T21:28:32.8083432+02:00

    • Marcado como respuesta Dave2203 jueves, 24 de octubre de 2019 19:43
    jueves, 24 de octubre de 2019 19:28

Todas las respuestas

  • Hola, mira encontré estos links..puede que sean de ayuda.

    link1

    link2

    link3

    Saludos.

    • Marcado como respuesta Dave2203 jueves, 24 de octubre de 2019 19:43
    jueves, 24 de octubre de 2019 18:15
  • Hola Dave2203:

    Si quieres una tabla temporal tendrás que realizar un drop antes.

    Pero puedes cambiarlo tambíen por una variable de tabla.

    DECLARE 
    
    @cliente INT,
    @region varchar(100),
    @fecIni DATETIME,
    @fecFin DATETIME;
    
    
    SET @cliente = 118;
    SET @region = '3';
    SET @fecIni = '2019-10-13 00:00:00';
    SET @fecFin = '2019-10-14 23:59:59';
    
    
    DECLARE @temp TABLE 
    (
    id int,
     Nombre varchar(250),
     Name varchar(20),
    valor numeric(12,4),
    columnNameEsp varchar(30),
    columnNameEng varchar(30),
    numOrder int
    );
    
         
    
    INSERT INTO @TEMP (ID, NOMBRE, NAME, VALOR,
    COLUMNNAMEESP, COLUMNNAMEENG, NUMORDER)
    
         EXEC SP_Reporte;

    • Marcado como respuesta Dave2203 jueves, 24 de octubre de 2019 19:43
    jueves, 24 de octubre de 2019 18:18
  • Muchas gracias por la ayuda pero me sigue arrojando el mismo error An INSERT EXEC statement cannot be nested.

    Pregunta

    jueves, 24 de octubre de 2019 18:32
  • Hola Dave2203:

    create procedure sp_reporte 
    as
    begin
    	select 1 as valor;
    	return
    end
    GO
    declare @table table(valor int)
    insert into @table (valor)
    exec sp_reporte

    (1 row affected)

    Completion time: 2019-10-24T21:04:02.9552842+02:00

    ¿Que devuelve tu sp_report?

    ¿Cuantas columnas y de que tipo?

    • Marcado como respuesta Dave2203 jueves, 24 de octubre de 2019 19:43
    jueves, 24 de octubre de 2019 19:05
  • Lo que pasa es que dentro del procedimiento tienen varios exec y los cambie por dinamicos , y ya no me sale el error, una pregunta JAVI que finalidad tiene el Return al final del select , es la primera vez que lo veo de esa manera 

    Pregunta

    jueves, 24 de octubre de 2019 19:15
  • Return finaliza un procedure si o si. Si pones instrucciones después no las ejecuta aunque esten dentro de un BEGIN END.

    Se puede devolver un int, con el return a modo de estado.

    Yo personalmente considero que es una buena praxis utiliazar return para cerrar el procedure y por ende la transacción.

    Si no pones un int, para la devolución, retorna 0 y "todas las aplicaciones del mundo" consideran que algo invocado cuando retorna 0 es una ejecución correcta. Pero es válido retornar otro valor.

    Return

    https://docs.microsoft.com/es-es/sql/t-sql/language-elements/return-transact-sql?view=sql-server-ver15#return-types

    Un simple ejemplo

    create or alter procedure sp_reporte 
    as
    begin
    	return 1;
    end
    GO
    declare @retorno int;
     exec @retorno = sp_reporte;
    select @retorno
    
    -----------
    1

    (1 row affected)
    Completion time: 2019-10-24T21:28:32.8083432+02:00

    • Marcado como respuesta Dave2203 jueves, 24 de octubre de 2019 19:43
    jueves, 24 de octubre de 2019 19:28
  • Muchas Gracias Javi 

    Pregunta

    jueves, 24 de octubre de 2019 19:43
  • De nada
    jueves, 24 de octubre de 2019 19:46