none
WHERE DINÂMICO RRS feed

  • Pergunta

  • Galera qual a melhor maneira de fazer um whare dinâmico?

    Ex: Parametros: @unidade char(3), @situacao char(1), @DATA NVARCHAR(11)

    SELECT * FROM

    TABELA

    WHERE (UNIDADE = @UNIDADE) AND (SITUACAO = @SITUACA) AND (DATA < @DATA)

    ** Como não fazer a comparação caso venha algum parâmetro vazio??

    Estou precisando da ajuda de vocês !!

    quarta-feira, 26 de dezembro de 2012 20:35

Respostas

  • Roberto,

    Eu faria da seguinte forma:

    SELECT * FROM

    TABELA

    WHERE (@UNIDADE IS NULL OR UNIDADE = @UNIDADE) AND (@SITUACAO IS NULL OR SITUACAO = @SITUACAO) AND (@DATA IS NULL OR DATA < @DATA)


    Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    • Sugerido como Resposta Alexandre Matayosi quinta-feira, 27 de dezembro de 2012 13:22
    • Marcado como Resposta Ricardo Russo quarta-feira, 2 de janeiro de 2013 12:11
    quinta-feira, 27 de dezembro de 2012 11:33
  • Recomendo que você leia o artigo do Erland sobre isso:

    http://www.sommarskog.se/dynamic_sql.html

    Fora as dicas que nossos amigos deram, se possível use o hint OPTION (RECOMPILE) para conseguir possíveis índices nas colunas com o filtro dinâmico, essa otimização é conhecida como "parameter embedding optimization". É claro que isso tem um custo, mas cabe a você saber se é possível usar o hint ou não.

    Leia o artigo para mais detalhes.

    Abs.


    Fabiano Neves Amorim - SQL Server MVP http://blogfabiano.com/

    sexta-feira, 28 de dezembro de 2012 06:54

Todas as Respostas

  • Roberto,

    Eu faria da seguinte forma:

    SELECT * FROM

    TABELA

    WHERE (@UNIDADE IS NULL OR UNIDADE = @UNIDADE) AND (@SITUACAO IS NULL OR SITUACAO = @SITUACAO) AND (@DATA IS NULL OR DATA < @DATA)


    Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    • Sugerido como Resposta Alexandre Matayosi quinta-feira, 27 de dezembro de 2012 13:22
    • Marcado como Resposta Ricardo Russo quarta-feira, 2 de janeiro de 2013 12:11
    quinta-feira, 27 de dezembro de 2012 11:33
  • Roberto,

    Tenta assim:

    Select
      SeusCampos 
    From
      SuaTabela
    Where
      (@unidade is null or unidade = @unidade) 
    and 
      (@situacao is null or situacao = @situacao) 
    and 
      (@data is null or data < @data)


    Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    quinta-feira, 27 de dezembro de 2012 11:57
  • Recomendo que você leia o artigo do Erland sobre isso:

    http://www.sommarskog.se/dynamic_sql.html

    Fora as dicas que nossos amigos deram, se possível use o hint OPTION (RECOMPILE) para conseguir possíveis índices nas colunas com o filtro dinâmico, essa otimização é conhecida como "parameter embedding optimization". É claro que isso tem um custo, mas cabe a você saber se é possível usar o hint ou não.

    Leia o artigo para mais detalhes.

    Abs.


    Fabiano Neves Amorim - SQL Server MVP http://blogfabiano.com/

    sexta-feira, 28 de dezembro de 2012 06:54
  • Fabiano,

    Boa alternativa, utilizando o Option Recompile estaremos instruíndo o SQL Server a destacar o plano de execução criado para o processamento desta transação, mas gerar e utilizar o um novo plano a cada execução da mesma, com isso teremos sempre o plano atualizado. Com você mesmo destacou teremos algum custo de tempo de processamento por parte do SQL Server no que se diz respeito ao trabalho do Query Optimizer em encontrar o melhor caminho antes de executar a transação.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    sexta-feira, 28 de dezembro de 2012 11:45