Pergunta

Como faço página de resultados do SQL Server 2005?

Eu tentei no SQL Server 2000, mas não havia nenhuma maneira confiável de fazer isso.Agora estou me perguntando se o SQL Server 2005 tem qualquer método?

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

Qualquer ajuda seria muito apreciada.

Foi útil?

Solução

Você pode usar the Row_Number() função.O seu usado da seguinte maneira:

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

Partir do qual ele vai produzir um conjunto de resultados com um RowID campo que você pode usar a 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

Outras dicas

Se você está tentando entrar em uma instrução (o total de mais de paginação).Você pode precisar para explorar suporte do SQL Server para a partição de cláusula (windowing funções em SQL ANSI termos).No Oracle a sintaxe é como o exemplo acima, usando o row_number(), mas eu também adicionou uma partição cláusula order by 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

Observe que eu tenho de onde owner = 'CSEIS' e a minha partição é proprietário.Portanto, 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

Aceito a resposta para isso não funciona para mim...eu tinha 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 foi.

Eu tinha a envolvê-la em um select interna como este:

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

e, em seguida, ele trabalhou.

Quando eu preciso fazer paginação, eu normalmente uso uma tabela temporária também.Você pode usar um parâmetro de saída para retornar o número total de registros.As instruções de caso na escolha permitem classificar os dados em colunas específicas sem a 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 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

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

Eu era capaz de fazer isso na minha posição anterior, utilizando a ajuda de esta página:Paginação em DotNet 2.0

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

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

A coisa legal sobre a fazê-lo desta maneira é que eu também tenho uma "Exportação" de link que permite que você obtenha todas as linhas do relatório retornado como CSV acima de todo o grid 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 paginação de lógica.Este aplaca os usuários que odeiam a paginação, e quero ver tudo, e pretende classificá-lo em um milhão de maneiras diferentes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top