Seleccionar 5 ultimos registros en orden ascendente...

Edu
25 de Agosto del 2004
Buenas, repito aquí una pregunta que he hecho en la sección de SQL Server para ver si alguien me la puede resolver aquí...

Quiero hacer una consulta desde un "Stored Procfedure" en SQL Server que me devuelva los últimos 5 registros de una tabla pero en orden ascendente...

He provado el famoso TOP 5, pero si le pongo el ORDER BY ... ASC me da los primeros registros de la tabla, si no pongo nada también me dan los cinco primeros y si le pongo ORDER BY DESC, me salen los últimos cinco tal cómo quiero, pero en orden descendente...

Entonces he probado de hacer una SubQuery para primero recojer los 5 últimos registros y luego reordenarlos en orden ascendente, cómo el caso de muestra posterior...

SELECT * FROM (SELECT TOP 5 Nombre_Cancion, Autor_Cancion
FROM dbo.Canciones
WHERE (Id_Estilo = "Rock_And_Roll")
ORDER BY Id_Cancion DESC) AS TABLA_VIRTUAL
ORDER BY ID_Cancion ASC

Esto me funciona, y efectivamente me da el resultado de los últimos cinco registros ordenados de menor a mayor por su id... bien, el caso es que cómo que el valor de filtrado (en este caso "Id_Estilo") viene dado dinamicamente por la peticion desde el servidor, al cambiar el valor concreto de "Rock_And_Roll" por un "@Estilo_Id" (que será el receptor del id del estilo musical seleccionado), resulta que me da un eror de sintaxis, por lo que la siguiente sentencia ya no funciona...

SELECT * FROM (SELECT TOP 5 Nombre_Cancion, Autor_Cancion
FROM dbo.Canciones
WHERE (Id_Estilo = @Estilo_Id)
ORDER BY Id_Cancion DESC) AS TABLA_VIRTUAL
ORDER BY ID_Cancion ASC

Pues eso... se admiten sugerencias. Me consta que con TRANSACT-SQL se pueden hacer virguerías de estas y cosas mucho más complejas, pero es que de momento tan solo me manejo bien con SQL clásico.

Muchas gracias de antemano

Isa? Islas
25 de Agosto del 2004

-- INICIO DEL CODIGO
CREATE PROCEDURE pr_ListaMiCancion
@Estilo_Id VARCHAR(20) --Dependera del valor
AS
SET NOCOUNT ON
DECLARE @SQLString NVARCHAR(100)

SET @SQLString = N'SELECT * FROM (SELECT TOP 5 Nombre_Cancion, Autor_Cancion
FROM dbo.Canciones
WHERE (Id_Estilo = '''[email protected]_Id+''')
ORDER BY Id_Cancion DESC) AS TABLA_VIRTUAL
ORDER BY ID_Cancion ASC'

EXEC pr_executesql @SQLString
-- FIN DEL CODIGO

¿Como se ejecuta?

EXECUTE pr_ListaMiCancion 'BLUES'


Edu
25 de Agosto del 2004
Muchísimas gracias!!!... de momento no he logrado hacerlo funcionar pues tengo que adaptarlo al caso concreto para el que lo necesito (que es más complejo que el caso didáctico de las canciones). Y encima, cómo no tengo ni idea de Transact, pues eso, que algún día tenía que ser el primero... aúnque de todas maneras, agradezco la situación que me obliga a tener que espabilarme en esta nueva faceta del SQL

Espero poderlo tener funcionando para mañana, ya te contaré que tal ha ído...