Wyniki Paging SQL Server 2005
Jak wyświetlić wyniki w SQL Server 2005?
Próbowałem w SQL Server 2000, ale nie było wiarygodnego sposobu, aby to zrobić. Zastanawiam się teraz, czy SQL Server 2005 ma jakąś wbudowaną metodę?
Co mam na myśli przez stronicowanie jest, na przykład, jeśli Lista użytkowników według ich nazwy użytkownika, chcę być w stanie zwrócić tylko pierwsze 10 rekordów, a następnie następne 10 rekordów i tak dalej.
Każda pomoc będzie bardzo mile widziana.
6 answers
Możesz użyć funkcji the Row_Number()
.
Stosuje się go w następujący sposób:
SELECT Row_Number() OVER(ORDER BY UserName) As RowID, UserFirstName, UserLastName
FROM Users
, z którego uzyskamy zbiór wyników z polem RowID
, którego można użyć do wyświetlenia strony pomiędzy.
SELECT *
FROM
( SELECT Row_Number() OVER(ORDER BY UserName) As RowID, UserFirstName, UserLastName
FROM Users
) As RowResults
WHERE RowID Between 5 AND 10
Etc
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-15 19:03:06
Jeśli próbujesz uzyskać to w jednym oświadczeniu(suma plus stronicowanie). Może być konieczne zbadanie obsługi SQL Server dla klauzuli partition by(funkcje okien w języku ANSI SQL). W Oracle składnia jest taka sama jak w powyższym przykładzie, używając row_number (), ale dodałem również klauzulę partition by, aby uzyskać całkowitą liczbę wierszy dołączonych do każdego wiersza zwracaną w stronicowaniu (całkowita liczba wierszy wynosi 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
Zauważ, że mam where owner = 'CSEIS' i moja partycja by jest włączona właściciel. Więc wyniki są:
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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-22 17:01:24
Zaakceptowana odpowiedź na to nie działa...Musiałem przeskoczyć przez jeszcze jedną obręcz, żeby to zadziałało.
Kiedy próbowałem odpowiedzieć
SELECT Row_Number() OVER(ORDER BY UserName) As RowID, UserFirstName, UserLastName
FROM Users
WHERE RowID Between 0 AND 9
Nie powiodło się, narzekając, że nie wie, czym jest RowID.
Musiałem owinąć go w wewnętrzne select TAK:
SELECT *
FROM
(SELECT
Row_Number() OVER(ORDER BY UserName) As RowID, UserFirstName, UserLastName
FROM Users
) innerSelect
WHERE RowID Between 0 AND 9
I wtedy zadziałało.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-15 17:56:08
Kiedy muszę zrobić stronicowanie, zazwyczaj używam tymczasowej tabeli, jak również. Możesz użyć parametru output, aby zwrócić całkowitą liczbę rekordów. Polecenia case w select pozwalają sortować dane w określonych kolumnach bez potrzeby uciekania się do dynamicznego 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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 16:17:24
Uważam, że musisz wykonać osobne zapytanie, aby to osiągnąć.
Udało mi się to osiągnąć na moim poprzednim stanowisku, korzystając z pomocy z tej strony: stronicowanie w DotNet 2.0
Mają również ciągnięcie liczby rzędów oddzielnie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-05 21:05:10
Oto co robię dla stronicowania: wszystkie moje duże zapytania, które muszą być paged są kodowane jako wstawki do tabeli temp. Tabela temp ma pole identity, które będzie działać w podobny sposób jak wspomniana powyżej metoda row_number (). Zapisuję liczbę wierszy w tabeli temp w parametrze wyjściowym, aby kod wywołujący wiedział, ile jest wszystkich rekordów. Kod wywołujący określa również, którą stronę chce i ile wierszy na stronę, które są wybrane z temp stolik.
Fajną rzeczą w robieniu tego w ten sposób jest to, że mam również link "eksport", który pozwala uzyskać wszystkie wiersze z raportu zwrócone jako CSV nad każdą siatką w mojej aplikacji. Ten link używa tej samej procedury składowanej: po prostu zwracasz zawartość tabeli tymczasowej zamiast wykonywać logikę stronicowania. To uspokaja użytkowników, którzy nienawidzą stronicowania i chcą zobaczyć Wszystko i chcą sortować to na milion różnych sposobów.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-13 14:16:13