none
Modificar procedimiento almacenado en tiempo de ejecucion RRS feed

  • Pregunta

  • Buenos días:

    Tengo un procedimiento almacenado bastante simple:

    create proc MuestraDatos as
    begin
        select * from Diario2016
    end

    Lo que quiero hacer es lo siguiente:

    1.- Coger la definicion del procedimiento almacenado, es decir, recorrer linea a linea el procedimiento almacenado

    2.- Cambia de la primera linea por ejemplo "MuestraDatos" por "MuestraDatos2017"

    3.- Cambiar tambien "Diario2016" por "Diario2017"

    4.- Todo esto lo guardaré en un string que ejecutaré y me creará el procedimiento almacenado "MuestraDatos2017

    5.- Posteriomente lo ejecutaré

    6.- Por ultimo lo eliminare ejecutando "DROP PROC MuestraDatos2017

    Lo que no sé es realizar el punto 1. ¿Alguna idea?

    Gracias,

    sábado, 1 de julio de 2017 10:16

Respuestas

  • "maleva" preguntó:

    > Tengo un procedimiento almacenado bastante simple:
    >
    > create proc MuestraDatos as
    > begin
    >     select * from Diario2016
    > end
    >
    > Lo que quiero hacer es lo siguiente:
    >
    > 1.- Coger la definicion del procedimiento almacenado, es decir, recorrer
    > linea a linea el procedimiento almacenado
    >

    Hola:

    Para leer la definición de un procedimiento almacenado existente en alguna base de datos de Microsoft SQL Server, puedes hacer uso del procedimiento almacenado del sistema sp_helptext, al cual le pasarás como parámetro de entrada el nombre del procedimiento almacenado cuya definición deseas leer, es decir, el nombre del procedimiento llamado "MuestraDatos":

    Ver la definición de un procedimiento almacenado

    > Lo que no sé es realizar el punto 1. ¿Alguna idea?

    Como escribes que no sabes realizar el punto 1, te comento que lo único que tienes que hacer desde tu aplicación de Visual Basic .net es abrir un lector de datos para leer el resultado de ejecutar el procedimiento almacenado sp_helptext, tal y como muestra el siguiente ejemplo:

    Imports System.Data.SqlClient Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click ' Declarar un objeto StringBuilder que almacenará ' la definición del procedimiento almacenado. ' Dim definition As New Text.StringBuilder() ' Cadena de conexión con la base de datos de SQL Server que contiene ' el procedimiento almacenado cuya definición se desea obtener. ' Dim cadenaConexion As String = "Data Source=(local);Initial Catalog=Prueba;Integrated Security=SSPI" Try ' Establecer una conexión con la base de datos. Using cnn As New SqlConnection(cadenaConexion) ' Crear el comando que se ejecutará. Dim cmd As SqlCommand = cnn.CreateCommand() ' Indicar el nombre del procedimiento almacenado del ' sistema que se desea ejecutar. cmd.CommandText = "sp_helptext" ' Como parámetro de entrada del procedimiento indicamos ' el nombre del procedimiento almacenado cuya definición ' deseamos obtener. cmd.Parameters.AddWithValue("@objname", "MuestraDatos") ' Indicar que se trata de un procedimiento almacenado. cmd.CommandType = CommandType.StoredProcedure ' Abrir la conexión. cnn.Open() Dim dr As SqlDataReader = cmd.ExecuteReader() While dr.Read() ' Leer el valor del único campo existente (Text), donde
    ' cada registro existente en el lector se corresponderá
    ' con una fila del procedimiento almacenado, fila que
    ' añadiremos al objeto StringBuilder. definition.AppendLine(Convert.ToString(dr(0))) End While End Using ' Mostramos el resultado de la definición obtenida. MessageBox.Show(definition.ToString(), "Definición del procedimiento almacenado") Catch ex As Exception ' Se ha producido un error MessageBox.Show(ex.Message) End Try End Sub


    Si todo ha ido bien, obtendrás el resultado que se muestra en la siguiente imagen:


    > 2.- Cambia de la primera linea por ejemplo "MuestraDatos" por "MuestraDatos2017"
    >
    > 3.- Cambiar tambien "Diario2016" por "Diario2017"
    >
    > 4.- Todo esto lo guardaré en un string que ejecutaré y me creará el procedimiento
    > almacenado "MuestraDatos2017
    >
    > 5.- Posteriomente lo ejecutaré
    >
    > 6.- Por ultimo lo eliminare ejecutando "DROP PROC MuestraDatos2017

    Si tu intención final es ejecutar la siguiente consulta SQL de selección:

        SELECT * FROM Diario2017

    me parece a mí que para ello no hace falta:

    • leer la definición del procedimiento,
    • crear un nuevo procedimiento almacenado,
    • ejecutarlo, y finalmente
    • eliminarlo.

    Siempre y cuando exista en la base de datos una tabla llamada Diario2017, la cual necesariamente también tendrá que existir si finalmente decides ejecutar todos esos pasos, tan solo tienes que ejecutar la consulta SQL indicada:

        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    
            Dim cadenaConexion As String = "Data Source=(local);Initial Catalog=Prueba;Integrated Security=SSPI"
            Dim dt As DataTable = Nothing
    
            Try
                Using cnn As New SqlConnection(cadenaConexion)
                    Dim cmd As SqlCommand = cnn.CreateCommand()
                    cmd.CommandText = "SELECT * FROM Diario2017"
                    Dim da As New SqlDataAdapter(cmd)
                    dt = New DataTable()
                    da.Fill(dt)
                End Using
    
                ' Mostramos el resultado en un control DataGridView
                DataGridView1.DataSource = dt
    
            Catch ex As Exception
                ' Se ha producido un error
                MessageBox.Show(ex.Message)
    
            End Try
    
        End Sub

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    martes, 4 de julio de 2017 16:55
    Moderador