[SQL] 페이징 SQL Server 2005의 결과
SQL페이징 SQL Server 2005의 결과
어떻게 2005 SQL Server의 I 페이지 결과를합니까?
나는 SQL 서버 2000에서 그것을 시도하지만,이 작업을 수행 할 신뢰할 수있는 방법이 없었다. SQL 서버 2005은 어떤 방법이 내장되어있는 경우 지금 궁금하네요?
자신의 이름으로 나는 목록의 사용자가, 내가 첫 번째 10 개 개의 레코드, 그 다음 10 개 개의 레코드 등을 반환 할 수 있도록하려면 내가 페이징을 의미하는 것은, 예를 들면이다.
어떤 도움이 많이 주시면 감사하겠습니다.
해결법
-
==============================
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.당신은 하나 개의 문장 (총 플러스 페이징)에서 얻을하려는 경우. 당신은 (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.이에 대한 허용 대답은 실제로 내가 일에 그걸 얻기 위해 한 번 더 후프 통해 점프했다 ... 나를 위해 작동하지 않습니다.
이에 대한 허용 대답은 실제로 내가 일에 그걸 얻기 위해 한 번 더 후프 통해 점프했다 ... 나를 위해 작동하지 않습니다.
나는 대답을 시도했을 때
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.내가 페이징을해야 할 때, 나는 일반적으로뿐만 아니라 임시 테이블을 사용합니다. 당신은 총 레코드 수를 반환하는 출력 매개 변수를 사용할 수 있습니다. 의 경우 문 당신이 동적 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.난 당신이 불행하게도 그것을 달성하기 위해 별도의 쿼리를 수행해야 할 것입니다 생각합니다.
난 당신이 불행하게도 그것을 달성하기 위해 별도의 쿼리를 수행해야 할 것입니다 생각합니다.
나는이 페이지의 도움을 사용하여 내 이전 위치에서이 작업을 수행 할 수 있었다 : DOTNET 2.0에서 페이징
그들은 또한 별도로 행 수를 당기고있다.
-
==============================
6.여기에 내가 페이징을 위해 할 작업은 다음과 같습니다 임시 테이블에 삽입으로 코딩되는 페이징 할 필요가 내 큰 쿼리의 모든. 임시 테이블은 상술 한 ROW_NUMBER ()와 유사한 방식으로 작용할 것이다 식별 분야를 갖는다. 호출 코드는 많은 총 레코드가 방법을 알고, 그래서 내가 출력 매개 변수의 임시 테이블의 행 수를 저장합니다. 호출 또한 코드 지정이 원하는 페이지 방법과 임시 테이블로부터 선택 페이지 당 많은 행.
여기에 내가 페이징을 위해 할 작업은 다음과 같습니다 임시 테이블에 삽입으로 코딩되는 페이징 할 필요가 내 큰 쿼리의 모든. 임시 테이블은 상술 한 ROW_NUMBER ()와 유사한 방식으로 작용할 것이다 식별 분야를 갖는다. 호출 코드는 많은 총 레코드가 방법을 알고, 그래서 내가 출력 매개 변수의 임시 테이블의 행 수를 저장합니다. 호출 또한 코드 지정이 원하는 페이지 방법과 임시 테이블로부터 선택 페이지 당 많은 행.
이 방법으로 그 일에 대한 시원한 것은 내가 아니라 당신이 내 응용 프로그램의 모든 그리드 위의 CSV로 반환 보고서에서 모든 행을 얻을 수있는 '내보내기'링크를 가지고있다. 이 링크는 같은 저장 프로 시저를 사용하면 페이징 로직을 수행하는 대신 임시 테이블의 내용을 반환 단지. 이 placates 페이징을 미워하고, 모든 것을보고 싶어하고, 만 가지 방법으로 그것을 정렬 할 사용자.
from https://stackoverflow.com/questions/2840/paging-sql-server-2005-results by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 실행 SELECT 문을 죽이는 방법 (0) | 2020.04.24 |
---|---|
[SQL] 어떻게 PowerShell을 사용 .SQL 파일을 실행하려면? (0) | 2020.04.23 |
[SQL] 은 "@"기호는 SQL의 기능은 무엇입니까? (0) | 2020.04.23 |
[SQL] 존재하지 않는 경우 어떻게하면 테이블의 행을 갱신 또는 삽입합니까? (0) | 2020.04.23 |
[SQL] SQL - 선택 처음 10 행에만? (0) | 2020.04.23 |