Paging SQL Server 2005 výsledky

hlasů
36

Jak výsledky I stránek v SQL Server 2005?

Zkoušel jsem to v SQL Server 2000, ale tam byl žádný spolehlivý způsob, jak to udělat. Já jsem teď přemýšlel, jestli SQL Server 2005 má jakýkoliv postavený v metodě?

Co tím chci říct klávesnici se například, když seznam uživatelů podle jejich uživatelského jména, chci, aby bylo možné vrátit pouze prvních 10 záznamů, pak další 10 záznamů a tak dále.

Pomoci by se moc líbí.

Položena 05/08/2008 v 21:57
zdroj uživatelem
V jiných jazycích...                            


6 odpovědí

hlasů
33

Můžete použít the Row_Number()funkci. Jeho používá takto:

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

Od kterého to přinese výsledek nastavit pomocí RowIDpole, které můžete použít pro stránku mezi nimi.

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

atd

Odpovězeno 05/08/2008 v 21:59
zdroj uživatelem

hlasů
0

Věřím, že byste třeba provést samostatnou dotaz, jak toho dosáhnout unfortionately.

Byl jsem schopen dosáhnout na mé předchozí pozici pomocí nějakou pomoc na této stránce: Paging v DotNet 2.0

Mají také to tahání počítat řádku samostatně.

Odpovězeno 05/08/2008 v 22:05
zdroj uživatelem

hlasů
0

Tady je to, co dělám pro klávesnici: Všechny mé velké dotazů, které je třeba stránkovány jsou kódovány jako vložky do temp tabulky. Temp tabulka má pole identity, která bude působit podobným způsobem jako ROW_NUMBER () je uvedeno výše. I ukládat počet řádků v tabulce temp v výstupní parametr, takže volající kód ví, kolik Celkem záznamů existují. Volající kód také určuje, které strana chce a kolik řádků na stránku, které jsou vybrány z temp tabulky.

Super věc o dělat to tímto způsobem je, že mám také odkaz „Export“, která vám umožní získat všechny řádky ze sestavy se vrátil jako CSV nad každé sítě v mé žádosti. Tento odkaz používá stejné uložené procedury: stačí vrátit obsah temp tabulky namísto dělat logiku stránkování. To uklidní uživatele, kteří nenávidí paging, a chtějí vidět všechno , a chcete jej řadit za milion různých způsobů.

Odpovězeno 13/08/2008 v 15:16
zdroj uživatelem

hlasů
13

Pokud se snažíte, aby si to v jednom výpisu (souhrn plus stránkovacího). Možná budete muset prozkoumat podporu SQL Server pro oddíl doložkou (okenního funkce v ANSI SQL termínů). V Oracle je syntaxe, stejně jako výše uvedený příklad s použitím ROW_NUMBER (), ale také jsem přidal oddíl doložkou získat celkový počet řádků zahrnuté v každé řadě se vrátil v klávesnici (celkem řádků je 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

Všimněte si, že mám kde majitel = ‚CSEIS‘ a můj oddíl by se na majitele. Takže výsledky jsou následující:

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
Odpovězeno 14/08/2008 v 18:15
zdroj uživatelem

hlasů
2

Když musím udělat stránkování, obvykle používám dočasné tabulky stejně. Můžete použít výstupní parametr vrátit celkový počet záznamů. Případové příkazy v select umožňují třídit údaje o konkrétních sloupcích aniž by bylo nutné uchýlit se k dynamické 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 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
Odpovězeno 16/09/2008 v 17:17
zdroj uživatelem

hlasů
5

Přijímané odpověď na to není ve skutečnosti pracovat pro mě ... Měl jsem skočit přes jeden více obručí se dostat do práce.

Když jsem se snažil odpověď

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

selhal, si stěžovat, že nevěděl, co rowid bylo.

Musel jsem to zabalit do vnitřní zvolit takto:

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

a pak to fungovalo.

Odpovězeno 15/04/2009 v 18:56
zdroj uživatelem

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