Diferentes ORDER BY en un procedimiento almacenado

27/11/2007 - 13:43 por Piolin Net | Informe spam
Alo!

Es posible hacer una consulta q pasandole un parametro orden de diferente
manera los resultados sin utilizar EXEC ni sql dinamico?

Preguntas similare

Leer las respuestas

#1 Maxi
27/11/2007 - 14:11 | Informe spam
Hola, lo mejor en estos casos seria resolverlo en la aplicacion, de hecho a
mi no me gusta poner order by en los Store y si que luego la aplicacion con
el resulset obtenido lo ordene como quiera. Por lo general uno envia las
cosas ordenadas y luego en la aplicacion o no se usan asi o se vuelven a
ordenar


-
Microsoft M.V.P en SQLServer
SQLTotal Consulting - Servicios en SQLServer
Email:
"Piolin Net" escribió en el mensaje
news:
Alo!

Es posible hacer una consulta q pasandole un parametro orden de diferente
manera los resultados sin utilizar EXEC ni sql dinamico?
Respuesta Responder a este mensaje
#2 Piolin Net
27/11/2007 - 16:05 | Informe spam
No creo q esa sea una solución muy adecuada para mi ya que estoy paginando
los resultados y seria un poco mas laborioso.

Haré por lo visto sql dinamico.

Gracias.

"Maxi" wrote:

Hola, lo mejor en estos casos seria resolverlo en la aplicacion, de hecho a
mi no me gusta poner order by en los Store y si que luego la aplicacion con
el resulset obtenido lo ordene como quiera. Por lo general uno envia las
cosas ordenadas y luego en la aplicacion o no se usan asi o se vuelven a
ordenar


-
Microsoft M.V.P en SQLServer
SQLTotal Consulting - Servicios en SQLServer
Email:
"Piolin Net" escribió en el mensaje
news:
> Alo!
>
> Es posible hacer una consulta q pasandole un parametro orden de diferente
> manera los resultados sin utilizar EXEC ni sql dinamico?



Respuesta Responder a este mensaje
#3 Gux (MVP)
27/11/2007 - 16:18 | Informe spam
Use un IF y segun la condicion haga un SELECT con un ORDER o un SELECT con
otro ORDER.

IF condicion
SELECT ... ORDER BY unOrden
ELSE
SELECT ... ORDER BY otroOrden

Gustavo Larriera, Microsoft MVP
https://mvp.support.microsoft.com/profile/gux
Este mensaje se proporciona tal como es, sin garantías de ninguna clase.



"Piolin Net" wrote:

Alo!

Es posible hacer una consulta q pasandole un parametro orden de diferente
manera los resultados sin utilizar EXEC ni sql dinamico?
Respuesta Responder a este mensaje
#4 Piolin Net
27/11/2007 - 16:22 | Informe spam
JEJE, gracias

esa era la logica ... no queria repetir 10 veces lo mismo cambiando solo el
order by

y como con el order by no va el IF o el CASE pues creo q sql dinamico es
menos voluminoso.

Gratxe.

"Gux (MVP)" wrote:

Use un IF y segun la condicion haga un SELECT con un ORDER o un SELECT con
otro ORDER.

IF condicion
SELECT ... ORDER BY unOrden
ELSE
SELECT ... ORDER BY otroOrden

Gustavo Larriera, Microsoft MVP
https://mvp.support.microsoft.com/profile/gux
Este mensaje se proporciona tal como es, sin garantías de ninguna clase.



"Piolin Net" wrote:

> Alo!
>
> Es posible hacer una consulta q pasandole un parametro orden de diferente
> manera los resultados sin utilizar EXEC ni sql dinamico?
Respuesta Responder a este mensaje
#5 Alejandro Mesa
27/11/2007 - 16:52 | Informe spam
Piolin Net,

De que se pueda hacer, si se puede. De que sea lo mas optimo, eso queda como
tarea de tu parte.

Puedes usar la funcion CASE, pero ten en cuenta que el resultado de la
funcion CASE, usara el tipo de dato de mas alta precedencia entre los tipos
que aparecen en la parte THEN o ELSE de la funcion.

Por ejemplo, el sgte query dara error, porque la columna [CustomerID] no
puede convertirse implicitamente hacia datetime.

DECLARE @i INT

SET @i = 2

SELECT oh.[OrderID], oh.[CustomerID], oh.[OrderDate]
FROM dbo.[Orders] AS oh
ORDER BY
CASE @i
WHEN 1 THEN oh.OrderID
WHEN 2 THEN oh.CustomerID
WHEN 3 THEN oh.OrderDate
END

Si asignas 1 a la variable @i, entonces SS convertira la columna [OrderID]
hacia datatime, que es el tipo de mayor precedencia, cosa que es posible
aunque el resultado de la conversion sea una fecha rara. Eso lo puedes en el
plan de ejecucion.

[Expr1002] = Scalar Operator(
CASE WHEN [@i]=(1) THEN

CONVERT_IMPLICIT(datetime,[Northwind].[dbo].[Orders].[OrderID] as
[oh].[OrderID],0)

ELSE CASE WHEN [@i]=(2) THEN
CONVERT_IMPLICIT(datetime,[Northwind].[dbo].[Orders].[CustomerID] as
[oh].[CustomerID],0) ELSE CASE WHEN [@i]=(3) THEN
[Northwind].[dbo].[Orders].[OrderDate] as [oh].[OrderDate] ELSE NULL END END
END)

Una forma de evitar esta conversion implicita, es hacer la conversion de un
tipo hacia otro de forma explicita, o convirtiendo todos los tipos hacia
SQL_VARIANT.

DECLARE @i INT

SET @i = 2

SELECT oh.[OrderID], oh.[CustomerID], oh.[OrderDate]
FROM dbo.[Orders] AS oh
ORDER BY
CASE @i
WHEN 1 THEN CAST(oh.OrderID AS SQL_VARIANT)
WHEN 2 THEN CAST(oh.CustomerID AS SQL_VARIANT)
WHEN 3 THEN CAST(oh.OrderDate AS SQL_VARIANT)
END

Date cuenta que ordenar alfabeticamente los tipos numericos, no siempre dan
el resultado esperado.

Ejemplo:

SELECT LTRIM(c1)
FROM (SELECT 1 AS c1 UNION ALL SELECT 12 UNION ALL SELECT 2) AS t
ORDER BY 1

Resultado,

1
12
2

Aqui te paso un articulo sobre el tema.

How do I use a variable in an ORDER BY clause?
http://databases.aspfaq.com/databas...lause.html

AMB


"Piolin Net" wrote:

Alo!

Es posible hacer una consulta q pasandole un parametro orden de diferente
manera los resultados sin utilizar EXEC ni sql dinamico?
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida