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

#6 Piolin Net
27/11/2007 - 20:19 | Informe spam
bueno cuando digo q no funciona el CASE es por sus limitaciones

no puedo poner DISTINCT en la select xq entonces no entiende el order by.
tampoco puedo ordenar x mas de un campo a la vez

... creo q sql dinamico es el winner.

saludos.

"Alejandro Mesa" wrote:

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
#7 Maxi
27/11/2007 - 20:35 | Informe spam
Hola, no se que version de SQL tiene ni como quiere paginar ni en donde,
pero yo evitaria estas cosas dinamicas con ordenamientos del lado del motor,
esto no sera nada performante


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

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?



email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida