none
¿Es posible modificar un procedimiento almacenado en tiempo de ejecución? RRS feed

  • Pregunta

  • Buenos dias

    ¿Cómo es posible modificar un procedimiento almacenado (para insertar ese campo) por código, en tiempo de ejecución?

    Me temo que no es posible, pero me gustaría estar seguro antes de ver otras opciones.

    Muchas gracias y saludos.

    lunes, 19 de noviembre de 2018 11:26

Respuestas

  • Hola Ángelroso:

    Como te ha indicado Alberto, solo tienes que enviar al SQL Server el Alter en un executeNonQuery y ya dispondrás del procedimiento desde ese momento modificado.

    ALTER PROCEDURE [G_AYUNTAMIENTOS].[dbo].[paPendientesCAñadir] 
    @vIDAYUNTAMIENTO INTEGER,
    @vC2007 BIT,
    @vC2008 BIT,
    @vC2009 BIT,
    @vC2010 BIT,
    @vC2011 BIT,
    @vC2012 BIT,
    @vC2013 BIT,
    @vC2014 BIT,
    @vC2015 BIT,
    @vC2016 BIT,
    @vC2017 BIT,
    @vC2018 BIT,
    @vC2019 BIT,
    @vC2020 BIT,
    @vC2021 BIT,
    @vC2022 BIT,
    @vC2023 BIT,
    @vC2024 bit, /*campo añadido*/
    @vIDPENDIENTEC INTEGER
    AS
    INSERT INTO PENDIENTESCOBRO(IDAYUNTAMIENTO,C2007,C2008,C2009,C2010,C2011,C2012,C2013,C2014,
    			C2015,C2016,C2017,C2018,C2019,C2020,C2021,C2022,C2023,C2024,IDPENDIENTEC)
     VALUES (@vIDAYUNTAMIENTO,@vC2007,@vC2008,@vC2009,@vC2010,@vC2011,@vC2012,@vC2013,@vC2014,
    			@vC2015,@vC2016,@vC2017,@vC2018,@vC2019,@vC2020,@vC2021,@vC2022,@vC2023,@vC2024,@vIDPENDIENTEC)
    RETURN

    Otra cosa, es que el código se alimente de tu tabla y cambie en tiempo de ejecución.

    En eso, me parece, que va a ser bastante (por no decir muchísimo) más dificil. En mi opinión.

    Si utilizas Entity Framework, es posible cambiar los objetos, agregandoles propiedades, directamente, pero no en tiempo de ejecución.

    Entity Framework DataBase First:

    https://www.campusmvp.es/recursos/post/entity-framework-code-first-database-first-y-model-first-en-que-consiste-cada-uno.aspx

    Execute non query Ado.Net:

    https://docs.microsoft.com/es-es/dotnet/framework/data/adonet/using-commands-to-modify-data

    Saludos

    • Propuesto como respuesta Sergio Parra lunes, 19 de noviembre de 2018 18:31
    • Marcado como respuesta Ángelroso lunes, 19 de noviembre de 2018 23:20
    lunes, 19 de noviembre de 2018 17:37
  • Hola.

    Reitero las gracias por tu atención.

    Efectivamente, Alberto ya había indicado lo del procedimiento almacenado y como me temía, lo demás, tal y como me comentas y que tenía casi la seguridad es prácticamente imposible.

    Buscaré otras opciones.

    Saludos 

     

    • Marcado como respuesta Pablo Rubio lunes, 19 de noviembre de 2018 20:09
    lunes, 19 de noviembre de 2018 17:52

Todas las respuestas

  • Hola Algelroso:

    Es posible que existan soluciones a tu incidencia, pero para eso lo mejor es que la detalles, ya que sino, los que leen tu solicitud, no pueden saber lo que quieres.

    Plasma tu procedimiento almacenado y di exactamente lo que quisieras, que hiciera, y seguro que encontramos una solución satisfactoria.

    Un saludo

    lunes, 19 de noviembre de 2018 11:52
  • Sí, es posible modificar un procedimiento almacenado en tiempo de ejecución. Simplemente transmites al servidor un comando "ALTER PROCEDURE..." con la nueva definición usando un ExecuteNonQuery y, si el programa llamante tiene suficientes permisos, el procedimiento se sustituye. Ojo, si en ese momento el procedimiento estaba ejecutándose, no se altera la ejecución en curso, solo afecta a posteriores llamadas que se hagan al procedimiento.
    • Propuesto como respuesta Sergio Parra lunes, 19 de noviembre de 2018 18:31
    lunes, 19 de noviembre de 2018 12:08
  • Muchas gracias por vuestro interés.

    Uno de los  procedimientos almacenados, el de insertar, es el siguiente:

    USE [G_AYUNTAMIENTOS]
    GO
    /****** Object:  StoredProcedure [dbo].[paPendientesCAñadir]    Script Date: 19/11/2018 13:48:43 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER PROCEDURE [dbo].[paPendientesCAñadir] 
    @vIDAYUNTAMIENTO INTEGER,
    @vC2007 BIT,
    @vC2008 BIT,
    @vC2009 BIT,
    @vC2010 BIT,
    @vC2011 BIT,
    @vC2012 BIT,
    @vC2013 BIT,
    @vC2014 BIT,
    @vC2015 BIT,
    @vC2016 BIT,
    @vC2017 BIT,
    @vC2018 BIT,
    @vC2019 BIT,
    @vC2020 BIT,
    @vC2021 BIT,
    @vC2022 BIT,
    @vC2023 BIT,
    @vIDPENDIENTEC INTEGER
    AS
    INSERT INTO PENDIENTESCOBRO(IDAYUNTAMIENTO,C2007,C2008,C2009,C2010,C2011,C2012,C2013,C2014,
    			C2015,C2016,C2017,C2018,C2019,C2020,C2021,C2022,C2023,IDPENDIENTEC)
     VALUES (@vIDAYUNTAMIENTO,@vC2007,@vC2008,@vC2009,@vC2010,@vC2011,@vC2012,@vC2013,@vC2014,
    			@vC2015,@vC2016,@vC2017,@vC2018,@vC2019,@vC2020,@vC2021,@vC2022,@vC2023,@vIDPENDIENTEC)

    Se trata de en su momento añadir un nuevo ejercicio, el C2024 y quisiera si es posible modificar en tiempo de ejecución el procedimiento almacenado y ya el código correspondiente a las diferentes capas: Datos, Entidades y Presentación.

    Muchas gracias nuevamente.

    Saludos.

     
    lunes, 19 de noviembre de 2018 12:54
  • Hola Ángelroso:

    Como te ha indicado Alberto, solo tienes que enviar al SQL Server el Alter en un executeNonQuery y ya dispondrás del procedimiento desde ese momento modificado.

    ALTER PROCEDURE [G_AYUNTAMIENTOS].[dbo].[paPendientesCAñadir] 
    @vIDAYUNTAMIENTO INTEGER,
    @vC2007 BIT,
    @vC2008 BIT,
    @vC2009 BIT,
    @vC2010 BIT,
    @vC2011 BIT,
    @vC2012 BIT,
    @vC2013 BIT,
    @vC2014 BIT,
    @vC2015 BIT,
    @vC2016 BIT,
    @vC2017 BIT,
    @vC2018 BIT,
    @vC2019 BIT,
    @vC2020 BIT,
    @vC2021 BIT,
    @vC2022 BIT,
    @vC2023 BIT,
    @vC2024 bit, /*campo añadido*/
    @vIDPENDIENTEC INTEGER
    AS
    INSERT INTO PENDIENTESCOBRO(IDAYUNTAMIENTO,C2007,C2008,C2009,C2010,C2011,C2012,C2013,C2014,
    			C2015,C2016,C2017,C2018,C2019,C2020,C2021,C2022,C2023,C2024,IDPENDIENTEC)
     VALUES (@vIDAYUNTAMIENTO,@vC2007,@vC2008,@vC2009,@vC2010,@vC2011,@vC2012,@vC2013,@vC2014,
    			@vC2015,@vC2016,@vC2017,@vC2018,@vC2019,@vC2020,@vC2021,@vC2022,@vC2023,@vC2024,@vIDPENDIENTEC)
    RETURN

    Otra cosa, es que el código se alimente de tu tabla y cambie en tiempo de ejecución.

    En eso, me parece, que va a ser bastante (por no decir muchísimo) más dificil. En mi opinión.

    Si utilizas Entity Framework, es posible cambiar los objetos, agregandoles propiedades, directamente, pero no en tiempo de ejecución.

    Entity Framework DataBase First:

    https://www.campusmvp.es/recursos/post/entity-framework-code-first-database-first-y-model-first-en-que-consiste-cada-uno.aspx

    Execute non query Ado.Net:

    https://docs.microsoft.com/es-es/dotnet/framework/data/adonet/using-commands-to-modify-data

    Saludos

    • Propuesto como respuesta Sergio Parra lunes, 19 de noviembre de 2018 18:31
    • Marcado como respuesta Ángelroso lunes, 19 de noviembre de 2018 23:20
    lunes, 19 de noviembre de 2018 17:37
  • Hola.

    Reitero las gracias por tu atención.

    Efectivamente, Alberto ya había indicado lo del procedimiento almacenado y como me temía, lo demás, tal y como me comentas y que tenía casi la seguridad es prácticamente imposible.

    Buscaré otras opciones.

    Saludos 

     

    • Marcado como respuesta Pablo Rubio lunes, 19 de noviembre de 2018 20:09
    lunes, 19 de noviembre de 2018 17:52