Skip Navigation Links
Novas Tecnologias
Ferramentas Adicionais
Ferramentas Adicionais


Dica No :
614
Assunto : SQL Server
Titulo: Criando Order By Dinamicamente

Gostou do texto ? Vote e dê sua opinião! Pontuação atual :

Translate this page now :






Adicione aos Favoritos!
BlogBlogs Rec6 Linkk Ueba Technorati Delicious DiggIt! StumbleUpon



Um dos grandes problemas na utilização de stored procedures é como criar a clausula order by dinamicamente, de forma que o client possa solicitar uma determinada ordenação.

Nós não devemos nunca tentar obter esse resultado através da concatenação de string, pois isso prejudica o SQL Server na hora de gerar o plano de execução da procedure, causando perda de performance. O exemplo abaixo deve ser evitado a todo custo :

Create procedure teste @ordem varchar(30) as
declare @sql varchar(200)
select @sql='select * from orders order by ' + @ordem
exec(@sql)

Uma forma alternativa de fazermos isso é através de um truque com a instrução case, veja um exemplo :


Create procedure teste @ordem varchar(30) as
select orderid,employeeid from orders order by
case @ordem
when 'employeeid' then employeeid
when 'orderid' then orderid
when 'orderdate' then orderdate
end

Bem interessante, pode ser usado em casos nos quais performance não seja uma questão crítica, mas se não for esse o caso, não use. Isso porque o cálculo necessário para gerar a ordenação dificulta a aplicação de um plano de execução mais otimizado.

Podemos observar isso no caso do employeeid. Se você fizer esse select e examinar o plano de execução verá que ele utiliza um index scan para trazer os dados. Na procedure acima ele precisa processar a ordenação, não utilizando o índice non clustered.

Uma outra alternativa é fazer IFs mais explicitos :


create procedure teste2 @ordem varchar(30) as

if @ordem='employeeid'
select orderid,employeeid from orders order by employeeid

if @ordem='orderid'
select orderid,employeeid from orders order by orderid

if @ordem='orderdate'
select orderid,employeeid from orders order by orderdate

Desta forma temos 3 selects distintos, o sql server manterá um plano de execução para cada, assim quando você examinar o plano de execução verá que ele utilizará o índice nonclustered para processar a ordenação por employeeid



Já se inscreveu para o DevDays no Rio ? Não ?! Inscreva-se já em http://www.bufaloinfo.com.br/devdaysrj/cartaleo.asp

Nome :
E-mail:
Comentarios :
 
 
Os Últimos Comentários
Nenhum comentário foi realizado ainda. Seja o primeiro !
Dicas
Dica do Dia
Receba Dicas Por Email
E-mail :  
 


 (help)
Aceito receber informativos do devASPNet, informações de eventos e treinamentos

Veja Quais Informativos Você Receberá

Pesquisar Dicas
Pesquisar Artigos, Dicas e Noticias

Banco de Dados
Algumas Entrevistas
Links Importantes

Búfalo Informática, Treinamento e Consultoria
R. Alvaro Alvim, 37/920 Centro - Cinelândia - Rio de Janeiro Cep: 20031-010
Tel : (21) 2262-1368 (21) 9240-5134 E-mail : Contato@bufaloinfo.com.br