none
Reemplazar query dinamico RRS feed

  • Pregunta

  • Estimados.

    En un SS2012 tengo actualmente un SP con query dinamico el cual quiero reemplazar para no usar query dinamico.

    Actualmente el aplicativo tiene 15 campos donde el usuario puede o no escribir algun texto para buscar.

    Entonces el actual SP es algo como esto:

    Set @query = 'Select * from etc '

    If (@id_area IS NOT NULL AND @id_area <> '')
    Begin
    Set @query = @query  + 'And p.Id_area = ' + STR(@id_area) + ' ';
    End
    If (@id_subarea IS NOT NULL AND @id_subarea <> '')
    Begin
    Set @query = @query  + 'And p.Id_sub_area = ' + STR(@id_subarea) + ' ';
    End

    Asi siguen con 15 opciones.

    Como puedo dejar de usar query dinamico y hacer solo una query para ello.

    Saludos Cordiales.


    DBA SQL Server Santiago/Chile

    viernes, 6 de julio de 2018 15:06

Respuestas

  • Hola CNAPM, en realidad para campos opcionales yo nunca Uso IF's por que para analizar cada caso posible terminas con un store procedure grandisimo y poco practico.

    Por ejemplo el Query que tienes con campos que pueden venir o no, yo lo resumiria en:

    Select * from etc where (p.IdArea = @id_area or @id_area IS NULL)

    AND (p.Id_sub_area = @id_subarea or @id_subarea IS NULL)

    --y asi con las 15 condiciones.

     

    Y como vez de esa forma, no requieres evaluar todo por IF's, te queda un solo Query que en caso de que un parametro venga vacio o nulo, la consulta evalua correctamente que el parametro esta nulo con la sentencia IS NULL por ende con el OR no lo evalua contra el campo de la tabla, dejandolo totalmente opcional, pero cuando contenga un valor, el or IS NULL no entra y se evalua la coincidencia contra tu tabla, pasando a evaluar los siguientes parametros de la condición y asi sucesivamente.

    Pruebalo y verás que es una forma mas elegante de recibir parametros opcionales en un solo query.

    Saludos


    Carlos Aldi




    • Editado Carlos Aldi viernes, 6 de julio de 2018 15:42
    • Marcado como respuesta CMAPM viernes, 6 de julio de 2018 16:05
    viernes, 6 de julio de 2018 15:31

Todas las respuestas

  • Este tipo de queries tienden a ser sencibles desde el punto de vista de el plan de ejecucion que se use dado el valor de sus parametros y suele beneficiarse al ser compilado en cada ejecucion (OPTION (RECOMPILE)).

    Para poder re-escribirlo es importante saber el tipo de dato de cada parametro/columna referenciada, asi como la nulabilidad de cada columna.

    Segun noto usan la funcion STR pero no nos dices el por que.

    Por lo pronto no uses "select *" y pongan la lista de columnas necesaria.  Tampoco concatenen los parametros sino que parametrizen la sentencia.


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    viernes, 6 de julio de 2018 15:29
  • Hola CNAPM, en realidad para campos opcionales yo nunca Uso IF's por que para analizar cada caso posible terminas con un store procedure grandisimo y poco practico.

    Por ejemplo el Query que tienes con campos que pueden venir o no, yo lo resumiria en:

    Select * from etc where (p.IdArea = @id_area or @id_area IS NULL)

    AND (p.Id_sub_area = @id_subarea or @id_subarea IS NULL)

    --y asi con las 15 condiciones.

     

    Y como vez de esa forma, no requieres evaluar todo por IF's, te queda un solo Query que en caso de que un parametro venga vacio o nulo, la consulta evalua correctamente que el parametro esta nulo con la sentencia IS NULL por ende con el OR no lo evalua contra el campo de la tabla, dejandolo totalmente opcional, pero cuando contenga un valor, el or IS NULL no entra y se evalua la coincidencia contra tu tabla, pasando a evaluar los siguientes parametros de la condición y asi sucesivamente.

    Pruebalo y verás que es una forma mas elegante de recibir parametros opcionales en un solo query.

    Saludos


    Carlos Aldi




    • Editado Carlos Aldi viernes, 6 de julio de 2018 15:42
    • Marcado como respuesta CMAPM viernes, 6 de julio de 2018 16:05
    viernes, 6 de julio de 2018 15:31