none
Ejecutar SP de SP almacenados en un tabla RRS feed

  • Pregunta

  • Hola a todos, necesito una mano en algo simple (creo), tengo varios SP, de los cuales unos 50 son "especiales" y bueno, lo que necesito es en una tabla, en una columna almacenar su nombre de esos SP (columna nombre), en otra columna sus parámetros y algo mas tal vez que me aconsejen.

    pero bueno el punto clave es que necesito crear un SP que reciba el un parámetro "nombreSP", este nombre compararlo con el de la tabla que ya dije y ejecutarlo con sus parámetros que tiene definido en la segunda columna de la tabla que ya dije, y si el parámetro "nombreSP" me mandan null se ejecuten todos los SP con sus parámetros que tiene definidos.

    huy espero haber explicado bien mi dilema.


    Roy Sillerico

    jueves, 8 de octubre de 2015 22:25

Respuestas

  • Más o menos es algo parecido a lo siguiente, pero tendrás que modificarlo para que se amolde a tus necesidades:

    DECLARE elCursor CURSOR
        FOR SELECT procedimiento, parametros FROM laTabla
    OPEN elCursor
    declare @nombre nvarchar(50)
    declare @params nvarchar(100)
    FETCH NEXT FROM elCursor INTO @nombre, @params
    WHILE @@FETCH_STATUS = 0
    BEGIN
        declare @sql nvarchar(1000)
        set @sql = N'EXEC '+@nombre+N' '+@params
        EXEC sp_executesql @sql
        FETCH NEXT FROM elCursor INTO @nombre, @params
    END
    CLOSE elCursor
    DEALLOCATE elCursor

    viernes, 9 de octubre de 2015 18:26

Todas las respuestas

  • Hola Roy Sillerico Segurondo,

    A menos que tengas una razón contundente para hacer lo que nos comentas personalmente yo lo veo tirado de los cabellos. ¿Qué valores pasarás a los parámetros cuando el nombre del procedimiento sea Null?.

    Es posible hacer lo que mencionas, pero en lo personal no estoy de acuerdo, quizá si nos comentas el objetivo o el problema que intentas suplir con el requerimiento podríamos tener mas claro el escenario y darte otros alcances.

    A la espera de tu feed-back

    jueves, 8 de octubre de 2015 22:40
  • Bueno los números de parámetros siempre serán los mismos (fecha, nombresSP), la fecha tiene como parámetro todos los SP asi que le fecha iria directito a la "Re-llamada" al SP destino, el parámetro nombre SP es con el fin de indicar cual es el SP a ejecutar, y en caso de que nombre SP sea null ejecute todos. Ahora creo que si se me entiende mejor :).


    Roy Sillerico

    jueves, 8 de octubre de 2015 22:44
  • Si tengo claro lo que nos comentas, lo que no entiendo es porque quieres hacerlo bajo esa forma, sé que quieres ejecutar uno o mas procedimientos, pero, no es lo correcto a menos que tengas un sustento firme, no has respondido que tarea intentas cumplir con ese requerimiento.

    ¿Es un proceso aislado a una aplicación?¿lo lanzas desde una aplicación? A lo que voy es que la lógica de que procedimiento es ejecutado debería pasar por una evaluación y ejecución directa y no por una consulta a base de datos. Si ya tienes el nombre del procedimiento (porque lo necesitas para hacer la búsqueda) y los procedimientos sólo tienen un parámetro (la fecha) ¿para que buscarlo en una tabla? ¿por qué no ejecutarlo de manera directa?

    jueves, 8 de octubre de 2015 23:01
  • Estimado Roy:

    Acá el tema se vuelve complejo por varias razones, uno es el tema del rendimiento, que tan óptimo se vuelve realizar este tipo de escenarios...

    Por mi parte, en una empresa en la que trabajé hace un buen tiempo, tenían algo así, para poder brindarle al usuario final la posibilidad de crear sus propios informes, donde el usuario indicaba, en un formulario de administración, que procedimiento almacenado se va a ejecutar, conque parámetros, y de que tipo era cada parámetro, todo esto lo guardábamos en una tabla, que básicamente tenía: el nombre del informe que había creado, el nombre del procedimiento almacenado que se debía ejecutar, otra donde se almacenaba la colección de parámetros y otra la colección de tipos (respetando el orden de los parámetros).

    Ya por ultimo en otra interfaz (la de ejecución) se le mostraban al usuario los informes personalizados que había creado (Listado de nombres de informes), al dar link a cada uno de ellos, se le solicitaban los valores que se iban a enviar en los distintos parámetros; pero la decisión de ejecución del procedimiento se tomaba en Interfaz de usuario, no en base de datos.

    No se si es claro mi aporte, pero creo que como Williams comenta, se necesita tener un razón muy poderosa para crear un procedimiento que ejecute procedimientos almacenados y de forma dinámica.

    Saludos cordiales,


    Camilo Villa

    viernes, 9 de octubre de 2015 5:29
  • Es simple la razón, hay una lista de SP que a diario crece, estos SP (ya diseñados y que no puedo tocarlos) deben ser ejecutados en diferentes tiempo (a veces a diario, a veces varias veces al día, a veces después de mas de una semana, bueno no es estándar), y algo muy importante es que o solo se ejecuta uno o bien todos. Mas que todo en el escenario donde hay que ejecutar todos es en el que necesito este SP, para que no haga la llamada uno por uno.

    Entonces el fin es tener un solo SP al que mande el nombre del SP, en base a ese nombre se ejecuto uno o todos, asi me evito el dilema de llamarlos a todos uno por uno.

    En realidad ya hice un SP para que ejecute todos, pero es en base a If, if else, if else, ..... y funciona, pero el dilema es que si aumenta un SP tendría qe también modificar este SP genérico y aumentar un else if y me parece mucho show. Prefiero que, en caso de que se aumente un SP, solo aumentar su nombre como registro en una tabla y que el SP genérico sigo funcionando normal, no tener que modificar el SP genérico cada vez que aumento o quito uno de los SP cotidianos.

    Bueno pero fuera de que sea o no correcto, alguien tiene la idea de como hacerlo???


    Roy Sillerico

    viernes, 9 de octubre de 2015 12:42
  • No es demasiado complicado de hacer, pero es feo...

    Simplemente, construye un Cursor que itere sobre un Select que te devuelva de la tabla los registros que quieras (todos o unos pocos o incluso uno solo, lo puedes controlar con un Where). Dentro del bucle que itera sobre los resultados del cursor, concatena dentro de una variable el nombre del procedimiento y sus parámetros (que acabas de extraer con el cursor), y luego llama a sp_executesql pasándole esa variable para que se ejecute.

    viernes, 9 de octubre de 2015 12:58
  • Hola Alberto, ya entendí tu lógica y me parece que es justo lo que necesito, tal vez por favor podrias proporcionarme un pequeño ejemplo. De antemano gracias.

    Roy Sillerico

    viernes, 9 de octubre de 2015 18:02
  • Más o menos es algo parecido a lo siguiente, pero tendrás que modificarlo para que se amolde a tus necesidades:

    DECLARE elCursor CURSOR
        FOR SELECT procedimiento, parametros FROM laTabla
    OPEN elCursor
    declare @nombre nvarchar(50)
    declare @params nvarchar(100)
    FETCH NEXT FROM elCursor INTO @nombre, @params
    WHILE @@FETCH_STATUS = 0
    BEGIN
        declare @sql nvarchar(1000)
        set @sql = N'EXEC '+@nombre+N' '+@params
        EXEC sp_executesql @sql
        FETCH NEXT FROM elCursor INTO @nombre, @params
    END
    CLOSE elCursor
    DEALLOCATE elCursor

    viernes, 9 de octubre de 2015 18:26