Usuário com melhor resposta
WHERE DINÂMICO

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 !!
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
-
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/
- Sugerido como Resposta Junior Galvão - MVPMVP sexta-feira, 28 de dezembro de 2012 11:41
- Marcado como Resposta Ricardo Russo quarta-feira, 2 de janeiro de 2013 12:12
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
-
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.
-
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/
- Sugerido como Resposta Junior Galvão - MVPMVP sexta-feira, 28 de dezembro de 2012 11:41
- Marcado como Resposta Ricardo Russo quarta-feira, 2 de janeiro de 2013 12:12
-
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]