Solución:
Estoy agregando una respuesta ya que muchas de las otras respuestas sugieren SQL dinámico, lo cual no es una mejor práctica. Puede agregar paginación usando un OFFSET-FETCH
cláusula, que le proporciona una opción para obtener solo una ventana o página de resultados de un conjunto de resultados.
Nota: OFFSET-FETCH
se puede utilizar solo con el ORDER BY
cláusula.
Ejemplo:
SELECT First Name + ' ' + Last Name FROM Employees
ORDER BY First Name
OFFSET 10 ROWS FETCH NEXT 5 ROWS ONLY;
Una forma (posiblemente no la mejor) de hacerlo es usar SQL dinámico
CREATE PROCEDURE [sp_Mk]
@page INT,
@size INT,
@sort nvarchar(50) ,
@totalrow INT OUTPUT
AS
BEGIN
DECLARE @offset INT
DECLARE @newsize INT
DECLARE @sql NVARCHAR(MAX)
IF(@page=0)
BEGIN
SET @offset = @page
SET @newsize = @size
END
ELSE
BEGIN
SET @offset = @page*@size
SET @newsize = @size-1
END
SET NOCOUNT ON
SET @sql="
WITH OrderedSet AS
(
SELECT *, ROW_NUMBER() OVER (ORDER BY " + @sort + ') AS ''Index''
FROM [dbo].[Mk]
)
SELECT * FROM OrderedSet WHERE [Index] BETWEEN ' + CONVERT(NVARCHAR(12), @offset) + ' AND ' + CONVERT(NVARCHAR(12), (@offset + @newsize))
EXECUTE (@sql)
SET @totalrow = (SELECT COUNT(*) FROM [Mk])
END
Aquí está SQLFiddle manifestación
Asumiendo@sort
es el column name
. prueba así
WITH OrderedSet AS
(
SELECT *,
ROW_NUMBER() OVER (ORDER BY (CASE @sort WHEN 'column_name'
THEN column_name END ) DESC)
AS 'Index'
FROM [dbo].[Mk]
)
en lugar de proporcionar @sort variable put column name based on @sort
. Espero que esto funcione.
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)