SqlServer.no

Paging med Stored Procedures

Ofte ønsker man å presentere data fra en database i en applikasjon eller på nettet. Men ofte er det fryktelig mye data. Det er da man trenger paging. Paging er å presentere litt data om gangen over flere sider slik at brukeren kan ble seg fra side til side. i .NET ligger det innebygget støtte for paging bl.a. i DataGrid, men dersom det er mye data i tabellen er det ikke en god måte å page på. Dette har med ytelse å gjøre, men med små datamengder er det et godt alternativ som er veldig enkelt å sette opp.

Paging med DataGrid og SqlDataSource i .NET

Den enkleste måten å page på er vha den innebygde støtten for paging i asp:DataGrid. Du trenger en DataSource og en DataGrid. Eksempelet er så enkelt at det ikke trenger så mye forklaring. Her er koden:

paging.aspx <asp:SqlDataSource
    runat="server"
    ID="ds"
    ConnectionString="<%$ ConnectionStrings:ConnString %>"
    SelectCommand="SELECT * FROM Users" />

<asp:DataGrid
    runat="server"
    ID="dtgData"
    DataSourceID="ds"
    AllowPaging="true"
    PageSize="5"
    OnPageIndexChanged="dtgData_PageIndexChanged" />

Paging.aspx.cs protected void dtgData_PageIndexChanged(object source, DataGridPageChangedEventArgs e)
{
    dtgData.CurrentPageIndex = e.NewPageIndex;
    dtgData.DataBind();
}

Så enkelt kan det gjøres, men som nevnt tidligere er dette en metode som ikke egner seg for store tabeller. kilde serverside.no

Paging med ROWCOUNT i SQL Stored Procedure

Det finnes flere måter å lage paging på, men etter å ha testet noen ulike varianter og lest en del på nettet er det helt tydlig en måte som er bedre enn alle de andre. Mange bruker #temp tabeller i SQL og det fungerer, men ved å bruke ROWCOUNT kan man øke ytelsen betraktelig.

Eksempel-data

UserId (PK) FirstName LastName
1 Scott Taylor
2 James Hamilton
3 Steve Craft
4 John Belushi

CREATE PROCEDURE spPaging
(
  @PageSize int,
  @PageNumber int
)
AS

DECLARE @StartID int
DECLARE @FirstID int
DECLARE @LastID int

SET ROWCOUNT 1
SELECT @StartID = UserId FROM Users Order BY UserId
SET ROWCOUNT 0

SELECT @LastID = (@PageSize * @PageNumber) + @StartID
SELECT @FirstID = (@PageSize * (@PageNumber-1)) + @StartID

SET ROWCOUNT @PageSize

SELECT UserId, FirstName, LastName FROM Users
WHERE (UserId >= @FirstID) AND (UserId < @LastID)
ORDER BY UserId

SET ROWCOUNT 0
GO

Legg inn litt flere rader i Users tabellen og test prosedyren med følgende SQL-script SELECT * FROM Users
EXEC spPaging @PageSize = 3, @PageNumber = 1
EXEC spPaging @PageSize = 3, @PageNumber = 2
EXEC spPaging @PageSize = 3, @PageNumber = 3

Dette er trolig den mest effektive måten å lage paging i SQL på. Både mtp prosessorbruk, antall reads i databasen og tid det tar å kjøre scriptet. I tillegg er metoden relativt enkel i forhold til bruk av temp-tabeller og table-varianter. kilde 4GuysFromRolla.com

Template World
06.02.2012 Faktura1
Desgin by:
Sist oppdatert:
Vi fakturerer med: