none
Duda sobre uso de OR RRS feed

  • Pregunta

  • Estimados.

    Supongamos tengo un SP p_ejemplo el cual tiene como parametro @num pero si no se le pasa es NULL

    Create p_ejemplo

    @num int = null

    AS

    BEGIN

    Select * From Tabla Where @num IS NULL or campo=@num

    END

    Es recomendado hacerlo de dicha manera o bien deben haber 2 SP uno donde el where campo@num y el otro sp el where NO exista ?

    Por mi parte soy partidario de hacer 2 SP, pero necesito sus opiniones.



    DBA SQL Server Santiago/Chile

    miércoles, 30 de agosto de 2017 19:21

Respuestas

  • Una forma segura seria creando dos procedimientos ya que el plan usado para satisfacer:

    select col1,...,coln from tabla

    no es el mismo que el plan para:

    select col1,...,coln from tabla where coln = @coln

    y viceversa.  En dependencia de cual parametro se use la primera vez que se ejecuta ese procedimiento sin que se tenga un plan de ejecucion en el cache.

    El problema se da cuando se tienen muchos parametros ya que el numero de procedimientos se incrementaria considerablemente de acuerdo a las posibles combinaciones del predicado.  

    Otra opcion es hacer una compilacion a nivel de sentencia (OPTION (RECOMPILE)) para que el optimizador escoja un plan nuevo que se adapte al valor del parametro pero esta sentencia se compilaria cada vez que se ejecute el sp y si este es de mucho uso pues podria impactar tambien.  Al compilarse la sentencia aquellas comparasiones como @parametro IS NULL se excluiran del predicado si este no contiene la marca NULL.

    Por ejemplo, si tenemos dos parametros y uno de ellos es NULL (digamos @col1) entonces el predicado:

    ...
    where (@col1 is null or col1 = @col1) and (@col2 is null or col2 = @col2)
    option (recompile);

    quedaria como:

    ...
    where (col2 = @col2)

    Aca les dejo un articulo bien detallado sobre busquedas dinamicas en T-SQL.

    http://www.sommarskog.se/dyn-search-2008.html#static


    AMB

    Some guidelines for posting questions...

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

    • Propuesto como respuesta Moderador M viernes, 1 de septiembre de 2017 19:22
    • Marcado como respuesta Moderador M lunes, 4 de septiembre de 2017 21:35
    miércoles, 30 de agosto de 2017 20:32

Todas las respuestas

  • Puedes perfectamente hacerlo con un solo procedimiento. El "...Where @num IS NULL or campo=@num" funciona sin problemas y devuelve los resultados esperados.
    miércoles, 30 de agosto de 2017 19:35
  • Pensaba que al hacerlo de dicha manera me generaba plan de ejecución distinto.

    DBA SQL Server Santiago/Chile

    miércoles, 30 de agosto de 2017 19:57
  • Una forma segura seria creando dos procedimientos ya que el plan usado para satisfacer:

    select col1,...,coln from tabla

    no es el mismo que el plan para:

    select col1,...,coln from tabla where coln = @coln

    y viceversa.  En dependencia de cual parametro se use la primera vez que se ejecuta ese procedimiento sin que se tenga un plan de ejecucion en el cache.

    El problema se da cuando se tienen muchos parametros ya que el numero de procedimientos se incrementaria considerablemente de acuerdo a las posibles combinaciones del predicado.  

    Otra opcion es hacer una compilacion a nivel de sentencia (OPTION (RECOMPILE)) para que el optimizador escoja un plan nuevo que se adapte al valor del parametro pero esta sentencia se compilaria cada vez que se ejecute el sp y si este es de mucho uso pues podria impactar tambien.  Al compilarse la sentencia aquellas comparasiones como @parametro IS NULL se excluiran del predicado si este no contiene la marca NULL.

    Por ejemplo, si tenemos dos parametros y uno de ellos es NULL (digamos @col1) entonces el predicado:

    ...
    where (@col1 is null or col1 = @col1) and (@col2 is null or col2 = @col2)
    option (recompile);

    quedaria como:

    ...
    where (col2 = @col2)

    Aca les dejo un articulo bien detallado sobre busquedas dinamicas en T-SQL.

    http://www.sommarskog.se/dyn-search-2008.html#static


    AMB

    Some guidelines for posting questions...

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

    • Propuesto como respuesta Moderador M viernes, 1 de septiembre de 2017 19:22
    • Marcado como respuesta Moderador M lunes, 4 de septiembre de 2017 21:35
    miércoles, 30 de agosto de 2017 20:32