복붙노트

[SQL] 페이징 SQL Server 2005의 결과

SQL

페이징 SQL Server 2005의 결과

어떻게 2005 SQL Server의 I 페이지 결과를합니까?

나는 SQL 서버 2000에서 그것을 시도하지만,이 작업을 수행 할 신뢰할 수있는 방법이 없었다. SQL 서버 2005은 어떤 방법이 내장되어있는 경우 지금 궁금하네요?

자신의 이름으로 나는 목록의 사용자가, 내가 첫 번째 10 개 개의 레코드, 그 다음 10 개 개의 레코드 등을 반환 할 수 있도록하려면 내가 페이징을 의미하는 것은, 예를 들면이다.

어떤 도움이 많이 주시면 감사하겠습니다.

해결법

  1. ==============================

    1.당신은 ROW_NUMBER () 함수를 사용할 수 있습니다. 다음과 같이 그것의 사용 :

    당신은 ROW_NUMBER () 함수를 사용할 수 있습니다. 다음과 같이 그것의 사용 :

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

    어떤에서 당신이 사이에 페이지에 사용할 수있는 ROWID 필드 결과 세트를 얻을 것입니다.

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

    기타

  2. ==============================

    2.당신은 하나 개의 문장 (총 플러스 페이징)에서 얻을하려는 경우. 당신은 (ANSI SQL 측면에서 기능을 윈도) 조항에 의해 파티션에 대한 SQL Server 지원을 탐구해야 할 수도 있습니다. 오라클에서 구문 그냥 ROW_NUMBER ()를 사용하여 위의 예처럼, 그러나 나는 또한 페이징에 반환 된 각 행에 포함 된 행의 총 수를 얻을 조항으로 파티션을 추가 (총 행은 1262입니다) :

    당신은 하나 개의 문장 (총 플러스 페이징)에서 얻을하려는 경우. 당신은 (ANSI SQL 측면에서 기능을 윈도) 조항에 의해 파티션에 대한 SQL Server 지원을 탐구해야 할 수도 있습니다. 오라클에서 구문 그냥 ROW_NUMBER ()를 사용하여 위의 예처럼, 그러나 나는 또한 페이징에 반환 된 각 행에 포함 된 행의 총 수를 얻을 조항으로 파티션을 추가 (총 행은 1262입니다) :

    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
    

    참고 소유자 = 'CSEIS'하여 내 파티션 소유자에 어디 있다고. 그래서 결과는 다음과 같습니다

    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
    
  3. ==============================

    3.이에 대한 허용 대답은 실제로 내가 일에 그걸 얻기 위해 한 번 더 후프 통해 점프했다 ... 나를 위해 작동하지 않습니다.

    이에 대한 허용 대답은 실제로 내가 일에 그걸 얻기 위해 한 번 더 후프 통해 점프했다 ... 나를 위해 작동하지 않습니다.

    나는 대답을 시도했을 때

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

    그것은 ROWID가 무엇인지 몰랐 불평하지 못했습니다.

    이 같은 내부 선택에서 포장했다 :

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

    그리고 그것은했다.

  4. ==============================

    4.내가 페이징을해야 할 때, 나는 일반적으로뿐만 아니라 임시 테이블을 사용합니다. 당신은 총 레코드 수를 반환하는 출력 매개 변수를 사용할 수 있습니다. 의 경우 문 당신이 동적 SQL에 의존 할 필요없이 특정 컬럼에 데이터를 정렬 할 수 있도록 선택합니다.

    내가 페이징을해야 할 때, 나는 일반적으로뿐만 아니라 임시 테이블을 사용합니다. 당신은 총 레코드 수를 반환하는 출력 매개 변수를 사용할 수 있습니다. 의 경우 문 당신이 동적 SQL에 의존 할 필요없이 특정 컬럼에 데이터를 정렬 할 수 있도록 선택합니다.

    --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
    
  5. ==============================

    5.난 당신이 불행하게도 그것을 달성하기 위해 별도의 쿼리를 수행해야 할 것입니다 생각합니다.

    난 당신이 불행하게도 그것을 달성하기 위해 별도의 쿼리를 수행해야 할 것입니다 생각합니다.

    나는이 페이지의 도움을 사용하여 내 이전 위치에서이 작업을 수행 할 수 있었다 : DOTNET 2.0에서 페이징

    그들은 또한 별도로 행 수를 당기고있다.

  6. ==============================

    6.여기에 내가 페이징을 위해 할 작업은 다음과 같습니다 임시 테이블에 삽입으로 코딩되는 페이징 할 필요가 내 큰 쿼리의 모든. 임시 테이블은 상술 한 ROW_NUMBER ()와 유사한 방식으로 작용할 것이다 식별 분야를 갖는다. 호출 코드는 많은 총 레코드가 방법을 알고, 그래서 내가 출력 매개 변수의 임시 테이블의 행 수를 저장합니다. 호출 또한 코드 지정이 원하는 페이지 방법과 임시 테이블로부터 선택 페이지 당 많은 행.

    여기에 내가 페이징을 위해 할 작업은 다음과 같습니다 임시 테이블에 삽입으로 코딩되는 페이징 할 필요가 내 큰 쿼리의 모든. 임시 테이블은 상술 한 ROW_NUMBER ()와 유사한 방식으로 작용할 것이다 식별 분야를 갖는다. 호출 코드는 많은 총 레코드가 방법을 알고, 그래서 내가 출력 매개 변수의 임시 테이블의 행 수를 저장합니다. 호출 또한 코드 지정이 원하는 페이지 방법과 임시 테이블로부터 선택 페이지 당 많은 행.

    이 방법으로 그 일에 대한 시원한 것은 내가 아니라 당신이 내 응용 프로그램의 모든 그리드 위의 CSV로 반환 보고서에서 모든 행을 얻을 수있는 '내보내기'링크를 가지고있다. 이 링크는 같은 저장 프로 시저를 사용하면 페이징 로직을 수행하는 대신 임시 테이블의 내용을 반환 단지. 이 placates 페이징을 미워하고, 모든 것을보고 싶어하고, 만 가지 방법으로 그것을 정렬 할 사용자.

  7. from https://stackoverflow.com/questions/2840/paging-sql-server-2005-results by cc-by-sa and MIT license