ventajas sirve que para microsoft desventajas descargar caracteristicas sql sql-server-2005 paging

sirve - sql server que es



PaginaciĆ³n de resultados de SQL Server 2005 (6)

Creo que necesitaría realizar una consulta por separado para lograr eso desafortunadamente.

Pude lograr esto en mi posición anterior usando un poco de ayuda de esta página: Paginación en DotNet 2.0

También lo tienen tirando de una fila por separado.

¿Cómo busco resultados en SQL Server 2005?

Lo probé en SQL Server 2000, pero no había una forma confiable de hacerlo. Ahora me pregunto si SQL Server 2005 tiene algún método integrado.

Lo que quiero decir con paginación es, por ejemplo, si enumero a los usuarios por su nombre de usuario, quiero poder devolver solo los primeros 10 registros, luego los siguientes 10 registros, etc.

Cualquier ayuda sería muy apreciada.


Cuando necesito hacer paginación, normalmente también uso una tabla temporal. Puede usar un parámetro de salida para devolver el número total de registros. Las declaraciones de casos en select le permiten ordenar los datos en columnas específicas sin necesidad de recurrir a SQL dinámico.

--Declaration-- --Variables @StartIndex INT, @PageSize INT, @SortColumn VARCHAR(50), @SortDirection CHAR(3), @Results INT OUTPUT --Statements-- SELECT @Results = COUNT(ID) FROM Customers WHERE FirstName LIKE ''%a%'' SET @StartIndex = @StartIndex - 1 --Either do this here or in code, but be consistent CREATE TABLE #Page(ROW INT IDENTITY(1,1) NOT NULL, id INT, sorting_1 SQL_VARIANT, sorting_2 SQL_VARIANT) INSERT INTO #Page(ID, sorting_1, sorting_2) SELECT TOP (@StartIndex + @PageSize) ID, CASE WHEN @SortColumn=''FirstName'' AND @SortDirection=''ASC'' THEN CAST(FirstName AS SQL_VARIANT) WHEN @SortColumn=''LastName'' AND @SortDirection=''ASC'' THEN CAST(LastName AS SQL_VARIANT) ELSE NULL END AS sort_1, CASE WHEN @SortColumn=''FirstName'' AND @SortDirection=''DES'' THEN CAST(FirstName AS SQL_VARIANT) WHEN @SortColumn=''LastName'' AND @SortDirection=''DES'' THEN CAST(LastName AS SQL_VARIANT) ELSE NULL END AS sort_2 FROM ( SELECT CustomerId AS ID, FirstName, LastName FROM Customers WHERE FirstName LIKE ''%a%'' ) C ORDER BY sort_1 ASC, sort_2 DESC, ID ASC; SELECT ID, Customers.FirstName, Customers.LastName FROM #Page INNER JOIN Customers ON ID = Customers.CustomerId WHERE ROW > @StartIndex AND ROW <= (@StartIndex + @PageSize) ORDER BY ROW ASC DROP TABLE #Page


Esto es lo que hago para la paginación: todas mis grandes consultas que necesitan ser paginadas están codificadas como insertos en una tabla temporal. La tabla temporal tiene un campo de identidad que actuará de manera similar al row_number () mencionado anteriormente. Almaceno el número de filas en la tabla temporal en un parámetro de salida para que el código de llamada sepa cuántos registros totales hay. El código de llamada también especifica qué página desea y cuántas filas por página se seleccionan de la tabla temporal.

Lo bueno de hacerlo de esta manera es que también tengo un enlace "Exportar" que le permite obtener todas las filas del informe devueltas como CSV sobre cada cuadrícula de mi aplicación. Este enlace utiliza el mismo procedimiento almacenado: simplemente devuelve el contenido de la tabla temporal en lugar de hacer la lógica de paginación. Esto aplaca a los usuarios que odian la paginación, y quieren verlo todo , y quieren ordenarlo de un millón de maneras diferentes.


La respuesta aceptada para esto en realidad no funciona para mí ... Tuve que saltar a través de un aro más para que funcione.

Cuando probé la respuesta

SELECT Row_Number() OVER(ORDER BY UserName) As RowID, UserFirstName, UserLastName FROM Users WHERE RowID Between 0 AND 9

falló, quejándose de que no sabía qué era RowID.

Tuve que envolverlo en una selección interna como esta:

SELECT * FROM (SELECT Row_Number() OVER(ORDER BY UserName) As RowID, UserFirstName, UserLastName FROM Users ) innerSelect WHERE RowID Between 0 AND 9

y luego funcionó.


Si está tratando de obtenerlo en una declaración (el total más la paginación). Es posible que deba explorar el soporte de SQL Server para la partición por cláusula (funciones de ventanas en términos ANSI SQL). En Oracle, la sintaxis es igual que el ejemplo anterior usando row_number (), pero también he agregado una partición por cláusula para obtener el número total de filas incluidas con cada fila devuelta en la paginación (el total de filas es 1,262):

SELECT rn, total_rows, x.OWNER, x.object_name, x.object_type FROM (SELECT COUNT (*) OVER (PARTITION BY owner) AS TOTAL_ROWS, ROW_NUMBER () OVER (ORDER BY 1) AS rn, uo.* FROM all_objects uo WHERE owner = ''CSEIS'') x WHERE rn BETWEEN 6 AND 10

Tenga en cuenta que tengo donde owner = ''CSEIS'' y mi partición por está en el propietario. Entonces los resultados son:

RN TOTAL_ROWS OWNER OBJECT_NAME OBJECT_TYPE 6 1262 CSEIS CG$BDS_MODIFICATION_TYPES TRIGGER 7 1262 CSEIS CG$AUS_MODIFICATION_TYPES TRIGGER 8 1262 CSEIS CG$BDR_MODIFICATION_TYPES TRIGGER 9 1262 CSEIS CG$ADS_MODIFICATION_TYPES TRIGGER 10 1262 CSEIS CG$BIS_LANGUAGES TRIGGER


Puede usar the Row_Number() . Se utiliza de la siguiente manera:

SELECT Row_Number() OVER(ORDER BY UserName) As RowID, UserFirstName, UserLastName FROM Users

Desde el cual obtendrá un conjunto de resultados con un campo RowID que puede usar para RowID entre ellos.

SELECT * FROM ( SELECT Row_Number() OVER(ORDER BY UserName) As RowID, UserFirstName, UserLastName FROM Users ) As RowResults WHERE RowID Between 5 AND 10

etc.