Foro de elhacker.net

Programación => Bases de Datos => Mensaje iniciado por: KandiZickZad en 12 Octubre 2010, 20:43 pm



Título: consulta sqlserver con order by dinamico
Publicado por: KandiZickZad en 12 Octubre 2010, 20:43 pm
Buenaaaas

Este es mi problema: estoy intentando hacer un procedimiento almacenado en SQL que realice una consulta a la bd. El sp es llamado desde una app en c# al darle click a un botón.

El sp recibe el string @ordenamiento que puede ser 'e.idEmpleado asc', 'e.idEmpleado desc', 'CantidadEmpleados asc' o 'CantidadEmpleados desc'.

Encontré la manera de realizar el ORDER BY dinámico, pero no funciona y creo que es porque esta recibiendo dos expresiones (ej.: e.idEmpleado y asc)

Código
  1. CREATE PROCEDURE consultaCorp4 (
  2. @ordenamiento VARCHAR
  3. )
  4. AS
  5. BEGIN
  6. SET NOCOUNT ON;
  7. SELECT e.idPlanta,COUNT(e.idEmpleado) AS CantidadEmpleados,SUM(dp.MontoBruto) AS SalariosBrutos,avg(dp.MontoBruto) AS SalarioBrutoPromedio
  8. FROM dbo.empleados e INNER JOIN dbo.detalle_planillas dp
  9. ON (e.idEmpleado=dp.idEmpleado)
  10. GROUP BY e.idPlanta
  11. ORDER BY
  12. CASE @ordenamiento
  13. WHEN 'e.idPlanta asc' THEN e.idPlanta ASC
  14. WHEN 'e.idPlanta desc' THEN e.idPlanta DESC
  15. WHEN 'CantidadEmpleados asc' THEN CantidadEmpleados ASC
  16. WHEN 'CantidadEmpleados desc' THEN CantidadEmpleados DESC
  17. END
  18. END
  19. GO
  20.  

De qué manera podría hacer la consulta para que funcione el ORDER BY dinámico?


Título: Re: consulta sqlserver con order by dinamico
Publicado por: [D4N93R] en 14 Octubre 2010, 14:51 pm
Qué error te da cuano ejecutas de esa forma?


Título: Re: consulta sqlserver con order by dinamico
Publicado por: Shell Root en 14 Octubre 2010, 18:35 pm
Si mal no recuerdo, intente hacerdlo, pero no me funko y me dio pereza buscar. xD

La cosa es de que, no toma el último argumento,
Código
  1. WHEN 'e.idPlanta asc' THEN e.idPlanta ASC
es decir, esta bien, pero no funciona en la parte de,
Código
  1. [-SNIP-] e.idPlanta ASC
solo toma
Código
  1. [-SNIP-] e.idPlanta [-SNIP-]


Título: Re: consulta sqlserver con order by dinamico
Publicado por: KandiZickZad en 15 Octubre 2010, 03:39 am
mm...tengo una solucion que parece ser muy ineficiente, pero creo que sera la solución temporal mientras encuentro manera de hacer lo que quería.

Código
  1. CREATE PROCEDURE [dbo].[consultaCorp4] (
  2. @ordenadoPor INT,
  3. @direccion INT
  4. )
  5. AS
  6. BEGIN
  7. SET NOCOUNT ON;
  8. IF @direccion=0
  9. SELECT e.idPlanta,COUNT(e.idEmpleado) AS CantidadEmpleados,SUM(dp.MontoBruto) AS SalariosBrutos,avg(dp.MontoBruto) AS SalarioBrutoPromedio
  10. FROM dbo.empleados e INNER JOIN dbo.detalle_planillas dp
  11. ON (e.idEmpleado=dp.idEmpleado)
  12. GROUP BY e.idPlanta
  13. ORDER BY CASE @ordenadoPor
  14. WHEN 0 THEN e.idPlanta
  15. WHEN 1 THEN 2--CantidadEmpleados
  16. END
  17. ASC
  18. -- otra opcion
  19. IF @direccion=1
  20. SELECT e.idPlanta,COUNT(e.idEmpleado) AS CantidadEmpleados,SUM(dp.MontoBruto) AS SalariosBrutos,avg(dp.MontoBruto) AS SalarioBrutoPromedio
  21. FROM dbo.empleados e INNER JOIN dbo.detalle_planillas dp
  22. ON (e.idEmpleado=dp.idEmpleado)
  23. GROUP BY e.idPlanta
  24. ORDER BY CASE @ordenadoPor
  25. WHEN 0 THEN e.idPlanta
  26. WHEN 1 THEN 2--CantidadEmpleados
  27. END
  28. DESC
  29. END
  30.  
  31. GO
  32.  

Sip, como dijo Shell Root, en el case solo se toma el primer argumento... para realizar lo que quería entonces tengo que hacer esto... en caso de que alguien logre hallar la solución, pueden responder en este tema pq la verdad sí me interesaría saber como hacerlo de una mejor manera XD estoy segura que debe haber una mejor manera que esta.


Título: Re: consulta sqlserver con order by dinamico
Publicado por: Shell Root en 15 Octubre 2010, 05:26 am
Pero estás ejecutando la misma QUERY, solo que cambia el ordenamiento. Porque no haces un SWITCH para ORDER BY, y otro SWITCH para ASC/DESC