none
Posibilidad de utilizar una lista genérica en procedimiento almacenado o en una cláusula Where.

    Pregunta

  • Hola a todos:

    En mi condición de estar aprendiendo cada día un poquito más, me lleva a hacer una pregunta que quizás no sea muy correcta, pero le estoy dando vueltas a la cabeza y mirando por google y al final entiendo menos que al principio.

    Bueno, el tema es que tengo por ejemplo un procedimiento almacenado para SqlServerExpress y después la consulta de selección correspondiente en este caso, pregunto esto, porque todo funciona perfectamente, pero dichas consultas se pueden agrandar bastante con la inclusión en la misma "fórmula" de otros países, por lo tanto la fórmula será la misma pero los parámetros de la cláusula Where serán diferentes.

    Todo ello, es para que me aconsejéis si sería mejor utilizar listas genéricas, querys Entitys, o como lo puedo hacer para reducir la cantidad de código que se puede generar. Por ejemplo el where que es lo que más espacio ocupa, rellenarlo a través de una lista y en ese caso como tendría que meter la lista en el where, es decir, Where = lista tal, ya que no veo la sintaxis correcta que tendría que aplicar., ya que con ello si reduciría drásticamente la longitud en líneas de la consulta, con lo que todo me sería más fácil de controlar o de ver.

    Os pongo el proceso almacenado para sqlserver y la consulta que está en una clase.

    If (nombreBaseDatos = "PerseoSqlEx") Then
                sql = "CREATE PROCEDURE dbo.procFormulasBalance5digGP  " &
                                "@empresa Nvarchar(3), @planconta Nvarchar(12), @codigo1 Nvarchar(6), @codigo2 Nvarchar(6), @codigo3 Nvarchar(6),  " &
                                "@codigo4 Nvarchar(6), @codigo5 Nvarchar(6) " &
                                "AS " &
                                "SELECT Ejer_01, Ejer_02, Ejer_03, Ejer_04, Ejer_05, Ejer_06, Ejer_07, Ejer_08, Ejer_09, Ejer_10, Ejer_11, Ejer_12  " &
                                "FROM Balances WHERE IdEmpresa = @empresa AND PlanConta = @planconta  " &
                                "AND Clave_GP IN (@codigo1, @codigo2, @codigo3, @codigo4, @codigo5)"
    
    
    Y la consulta que llama a este procedimiento es la siguiente:
    
     'Accedemos al stored procedure o bien a la fórmula del mismo según versión Base de datos.
                                cmd = MetodosCreacion.NombreProcFormulas("CreacionprocFormulasBalance_5_digitosGP")
    
                                With cmd.Parameters
                                    .Clear()
                                    .Add(Configuracion.CreateParameter(cmd, "@empresa", VarGlobal.StrCodEmpresa))
                                    .Add(Configuracion.CreateParameter(cmd, "@planconta", "COLOMBIA"))
                                    .Add(Configuracion.CreateParameter(cmd, "@codigo1", "A11"))
                                    .Add(Configuracion.CreateParameter(cmd, "@codigo2", "A12"))
                                    .Add(Configuracion.CreateParameter(cmd, "@codigo3", "A13"))
                                    .Add(Configuracion.CreateParameter(cmd, "@codigo4", "A14"))
                                    .Add(Configuracion.CreateParameter(cmd, "@codigo5", "A17"))
                                End With

    No pongo la consulta entera ya que creo que la idea queda plasmada en el trozo de código que me interesa, es decir, sustituir la brutalidad de parámetros que tengo por una lista y aplicarla al Where si eso es lo más aconsejable.

    Un cordial saludo a todos.

    Gemma

    martes, 30 de agosto de 2016 17:31

Respuestas

  • Hay varios trucos para pasar varios parámetros de golpe, como por ejemplo encapsularlos en XML. Pero si tienes una versión reciente de SQL Server y de las herramientas cliente, quizá lo más sencillo sea usar una tabla. En el lado del SP se declara un parámetro de tipo TABLE, y en lugar del WHERE se hace un JOIN de ese parámetro contra la consulta. En el lado cliente, se pasa como valor del parámetro un DataTable, que es muy fácil de cargar por código con la lista de valores. Busca algún ejemplo y cópialo, porque no es trivial lo de declarar el parámetro tipo tabla (hace falta declarar un tipo y luego ponerlo como argumento readonly en el procedimiento).
    • Marcado como respuesta gemma_campillo miércoles, 31 de agosto de 2016 5:20
    martes, 30 de agosto de 2016 21:57

Todas las respuestas

  • Hay varios trucos para pasar varios parámetros de golpe, como por ejemplo encapsularlos en XML. Pero si tienes una versión reciente de SQL Server y de las herramientas cliente, quizá lo más sencillo sea usar una tabla. En el lado del SP se declara un parámetro de tipo TABLE, y en lugar del WHERE se hace un JOIN de ese parámetro contra la consulta. En el lado cliente, se pasa como valor del parámetro un DataTable, que es muy fácil de cargar por código con la lista de valores. Busca algún ejemplo y cópialo, porque no es trivial lo de declarar el parámetro tipo tabla (hace falta declarar un tipo y luego ponerlo como argumento readonly en el procedimiento).
    • Marcado como respuesta gemma_campillo miércoles, 31 de agosto de 2016 5:20
    martes, 30 de agosto de 2016 21:57
  • Hola Alberto:

    Gracias por responder. Voy a analizar punto por punto lo que me has indicado y me pongo a ver que saco. Es que he de encontrar la manera porque si no se me va a complicar el programa con su crecimiento en cuanto a las selects y updates.

    Gracias como siempre y voy a ver si encuentro ejemplos de lo que me has indicado.

    Gracias como siempre.

    Un abrazo.

    Gemma

    miércoles, 31 de agosto de 2016 5:20