23. september 2005 - 11:53Der er
9 kommentarer og 1 løsning
Stored procedure som henter post 10-20 fx
Jeg har brug for en stored procedure, som henter i én tabel. Den skal hente et bestemt index af posterne - fx 10-20 eller 50-60. Og det skal være variabelt, hvilket index, der skal hentes. Jeg har prøvet mig frem i noget a'la:
ALTER PROCEDURE dbo.getFilteredNews
@Filter VARCHAR(10)
AS SELECT @Filter * FROM news
Men det var vist ikke lige løsningen. Jeg tror dog, at mit forsøg giver god forståelse for, hvad det er, jeg prøver at opnå. Nogen forslag?
og så lade @Filter være 10, 20, 30 og skip de første 0, 10, 20 rækker
SQLServer har ikke LIMIT n,m
Man kan første hapse 30 med en sortering og derefter 10 med den omvendte sortering, men performance er nok ikke god - skriv hvis du vil se det alligevel
Jeg skal bruge det til at lave paging i en datalist i ASP.NET, og grunden til jeg vil bruge en stored procedure til at generere min collection er at jeg ikke vil hente hver eneste post i tabellen hvis der alligevel kun bliver paged til side 2... Så hvis der er andre løsninger på dette, er de også velkomne... :)
Er en extra kolonne med rækkenumre i din tabel ikke det nemmeste - evt. baseret på en IDENTITY? Så er det jo efterfølgende bare en simpel WHERE - med mindre der også skal kunne ske dynamisk sortering.
arne_v, jeg ville gerne undgå at hente de rækker, som jeg ikke har brug for. Ellers kan jeg lige så godt hente det hele ud på én gang. Jeg ville gerne nøjes med bare at hente 10 ad gangen...
clausdamlund, det lyder ikke særlig smart at skulle lave om i databasen for at kunne præsentere dataen på sådan en måde. Der må findes en måde at trække det rigtigt ud på.
Måske: @Filter as Int EXEC('SELECT TOP ' + @Filter + ' * FROM news n1 WHERE NOT EXISTS(SELECT TOP ' + @Filter-10 + ' * FROM news n2 WHERE n1.newsid = n2.newsid)')
Hvor jeg forestiller mig newsid er dit primærnøglefelt i news.
Nej, du binder dig ikke til 10 - du får de 10 poster som ligger forud for det tal du kalder proceduren med. Kalder du den med 50 (@filter=50), får du post 41-50.
Så fik jeg det til at virke som jeg ville. Jeg brugte det eksempel jeg skrev - dog med nogle rettelser:
CREATE PROCEDURE dbo.getFilteredNews
@PageSize int, @PageNumber int AS DECLARE @Ignore int DECLARE @LastID int
IF @PageNumber > 1 BEGIN /* For pages > 1 compute how many records to ignore, set ROWCOUNT and SELECT ID into @LastID */ SET @Ignore = @PageSize * (@PageNumber - 1) SET ROWCOUNT @Ignore
SELECT @LastID = id FROM news ORDER BY id DESC END
SET ROWCOUNT @PageSize
SELECT * FROM news WHERE id < @LastID ORDER BY id DESC
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.