Paginação SQL Server 2005 Resultados

votos
36

Como página I resulta em SQL Server 2005?

Eu tentei-o em SQL Server 2000, mas não havia nenhuma maneira confiável para fazer isso. Eu estou querendo saber agora se o SQL Server 2005 tem qualquer construído em método?

O que quero dizer com paginação é, por exemplo, se eu listar usuários por seu nome de usuário, eu quero ser capaz de retornar somente os 10 primeiros registros, em seguida, os próximos 10 registros e assim por diante.

Qualquer ajuda seria muito apreciada.

Publicado 05/08/2008 em 21:57
fonte usuário
Em outras línguas...                            


6 respostas

votos
33

Você pode usar the Row_Number()a função. Seu usado como segue:

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

A partir do qual ele irá produzir um resultado definido com um RowIDcampo que você pode usar para página entre.

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

etc

Respondeu 05/08/2008 em 21:59
fonte usuário

votos
13

Se você está tentando obtê-lo em uma declaração (o total mais a paginação). Você pode precisar para explorar o suporte do SQL Server para a partição pela cláusula (funções de janelas em termos SQL ANSI). No Oracle a sintaxe é como o exemplo acima usando row_number (), mas eu também adicionou uma partição pela cláusula para obter o número total de linhas incluídas com cada linha retornada na paginação (total de linhas é 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

Note que eu tenho onde proprietário = 'CSEIS' e minha partição está no proprietário. Assim, os resultados são:

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
Respondeu 14/08/2008 em 18:15
fonte usuário

votos
5

A resposta aceite para este na verdade não funciona para mim ... Eu tive que saltar através de mais um aro para fazê-lo funcionar.

Quando eu tentei a resposta

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

ele falhou, reclamando que ele não sabia o que RowID era.

Eu tive que envolvê-la em um interior seleccionar assim:

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

e depois ele trabalhou.

Respondeu 15/04/2009 em 18:56
fonte usuário

votos
2

Quando eu preciso fazer paginação, eu normalmente usar uma tabela temporária também. Você pode usar um parâmetro de saída para retornar o número total de registros. As demonstrações de casos no seleto permitir que você classificar os dados em colunas específicas, sem necessidade de recorrer a SQL dinâmica.

--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 IGNORE  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
Respondeu 16/09/2008 em 17:17
fonte usuário

votos
0

Aqui está o que eu faço para paginação: Todos os meus grandes consultas que precisam ser paginada são codificados como inserções em uma tabela temporária. A tabela a temperatura tem um campo de identidade que irá actuar de um modo semelhante ao row_number () mencionado acima. Eu armazenar o número de linhas na tabela temporária em um parâmetro de saída para que o código de chamada sabe quantos registros totais existem. O código de chamada também especifica qual página que quer, e quantas linhas por página, que são selecionados a partir de tabela temporária.

A coisa legal sobre fazê-lo desta maneira é que eu também tenho um link "Export", que permite que você obtenha todas as linhas do relatório retornado como CSV acima de todo grade em meu aplicativo. Esta ligação utiliza o mesmo procedimento armazenado: você acabou de retornar o conteúdo da tabela temporária em vez de fazer a lógica de paginação. Este aplaca usuários que odeiam paginação, e querem ver tudo , e querem classificá-lo em um milhão de maneiras diferentes.

Respondeu 13/08/2008 em 15:16
fonte usuário

votos
0

Eu acredito que você precisa para realizar uma consulta separada para realizar esse unfortionately.

Eu era capaz de conseguir isso na minha posição anterior, através de alguma ajuda desta página: paginação em DotNet 2.0

Eles também têm que puxar uma linha contar separadamente.

Respondeu 05/08/2008 em 22:05
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more