none
Pasar los rows de una tabla temp a un procedimiento RRS feed

  • Pregunta

  • Buenos dias

    La pregunta es como puedo ejecutar un procedimiento N cantidad de veces  , Ejemplo tengo una consulta que paso a una tabla temporal y una columna de esa tabla temporal es el Id que tengo que pasar al procedimiento almacenado ( hace varios inserts) , pense en primera instancia hacer un while y que se ejecute N cantidad de veces dependiendo de las Rows que viene en la tabla temporal , el problema aqui es no se como hacer el while o bien si tienen una mejor idea de como hacerlo, se los agradecere .

    Saludos 


    Pregunta

    sábado, 27 de abril de 2019 15:02

Respuestas

  • Hola Dave223:

    Esa opción expuesta es un poco compleja, para lo que tu quieres hacer, y se puede resolver de un modo mucho más simple. 

    Con tú propio código, siempre que no requieras nada de tu procedure.

    select id, nombre, direccion
    into #todo
    from usuarios
    
    declare @A int , @i int;
    Declare @param1 varchar(100), @param2 uniqueidentifier, @param3 varchar(4);
    
    set @A = ( SELECT count(*)  FROM #todo )
    SET @i = 0
    
    WHILE (@i<=@A) 
    BEGIN
    select 
        @param1 = nombre, @param2 = ID, @param3 =direccion from #todo
    	   where mifila = @i;
    /* solo puedes asignar un valor, entiendo que sale de una fila a los parametros */
    
     exec sp_miProcedure @param1, @param2, @param3, @param4
    
      SET @i = @i+ 1    
    END

    Esta sería una opción.

    Otra opción más "elegante" en tsql, realizando exactamente lo mismo.

    select id, nombre, direccion
    into #todo
    from usuarios
    
    Declare @paramNombre varchar(100), @paramId int, @paramDirección varchar(100)
    
    declare cCursor for
    SELECT NOMBRE, ID, direccion
    FROM #todo;
    /* El cursor se monta sobre una consulta, por tanto a lo mejor puedes prescindir de la tabla temporal */
    
    open cCursor;
    Fetch cCursor into @paramNombre, @paramId, @paramDireccion;
    While (@@FETCH_STATUS = 0)
    begin
    
        exec sp_miProcedimiento @paramId, @paramNombre, @paramDirección;
        /* llamas a tu procedure con los parametros, en el orden que espera recibirlos */
    
    Fetch cCursor into @paramNombre, @paramId, @paramDireccion;
    end
    Close cCursor;
    Deallocate cCursor;

    • Marcado como respuesta Dave2203 martes, 30 de abril de 2019 18:02
    domingo, 28 de abril de 2019 5:39

Todas las respuestas

  • Hola

    Me parece que es mejor el for que el while en este caso porque tenés el índice y la misma variable que verifica el límite de Rows

    Básicamente podría ser así:

    int a, Id;
    
    for (a = 0; a < numeroDeRows; a++)
    
    {
    
        Id = obtenerIdRow(a);
    
        EjecutarProcedimiento(Id);
    
    }
    
    

    Donde 'numeroDeRows' es algo como tabla.Rows.Count, 'obtenerIdRow(a)' es un método o lineas de código que obtienen el valor int del campo Id del Row (cuyo índice es 'a', que debe comenzar en 0) y lo asignan a la variable int Id, y 'EjecutarProcedimiento(Id)' es un método o líneas de código que hacen que se ejecute el procedimiento almacenado pasándole el Id de cada Row

    Cómo literalmente se escribe cada una de las 3 cosas, no se, pero creo que se puede investigar fácilmente


    sábado, 27 de abril de 2019 18:01
  • Gracias por responder a mi me pregunta, si tengo una tabla temporal que traigo de una consulta externa ejemplo

    select id, nombre, direccion

    into #todo

    from usuarios

    declare @A int , @i int

    set @A = ( SELECT count(*)  FROM #todo )

    SET @i = 0

    WHILE (@i<=@A) BEGIN

    * Como pondria el procedimiento aqui, como mandaria los datos de la tabla temporal al procedimiento

    *

    nombreprocedimiento() ( este procedimiento tengo que mandarle los parametros para insertar )

    SET @i = @i+ 1     END


    Pregunta

    sábado, 27 de abril de 2019 18:25
  • Perdón, estaba pensando en C# ... y vos estás con TSQL

    Fijate si te sirve esto 

    https://docs.microsoft.com/en-us/previous-versions/sql/sql-server-2008/bb510489(v=sql.100)

    Pareciera que hay que pasarle al Procedimiento almacenado una especie de Tabla como parámetro y dentro del mismo hacés un INSERT INTO () SELECT () FROM tabla, mirá bien el ejemplo de abajo de todo 

    Para ejecutar un procedimiento se usa EXEC

    Saludos

    sábado, 27 de abril de 2019 19:33
  • Hola Dave223:

    Esa opción expuesta es un poco compleja, para lo que tu quieres hacer, y se puede resolver de un modo mucho más simple. 

    Con tú propio código, siempre que no requieras nada de tu procedure.

    select id, nombre, direccion
    into #todo
    from usuarios
    
    declare @A int , @i int;
    Declare @param1 varchar(100), @param2 uniqueidentifier, @param3 varchar(4);
    
    set @A = ( SELECT count(*)  FROM #todo )
    SET @i = 0
    
    WHILE (@i<=@A) 
    BEGIN
    select 
        @param1 = nombre, @param2 = ID, @param3 =direccion from #todo
    	   where mifila = @i;
    /* solo puedes asignar un valor, entiendo que sale de una fila a los parametros */
    
     exec sp_miProcedure @param1, @param2, @param3, @param4
    
      SET @i = @i+ 1    
    END

    Esta sería una opción.

    Otra opción más "elegante" en tsql, realizando exactamente lo mismo.

    select id, nombre, direccion
    into #todo
    from usuarios
    
    Declare @paramNombre varchar(100), @paramId int, @paramDirección varchar(100)
    
    declare cCursor for
    SELECT NOMBRE, ID, direccion
    FROM #todo;
    /* El cursor se monta sobre una consulta, por tanto a lo mejor puedes prescindir de la tabla temporal */
    
    open cCursor;
    Fetch cCursor into @paramNombre, @paramId, @paramDireccion;
    While (@@FETCH_STATUS = 0)
    begin
    
        exec sp_miProcedimiento @paramId, @paramNombre, @paramDirección;
        /* llamas a tu procedure con los parametros, en el orden que espera recibirlos */
    
    Fetch cCursor into @paramNombre, @paramId, @paramDireccion;
    end
    Close cCursor;
    Deallocate cCursor;

    • Marcado como respuesta Dave2203 martes, 30 de abril de 2019 18:02
    domingo, 28 de abril de 2019 5:39