Avatar billede agertoft Nybegynder
23. september 2005 - 11:53 Der 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?
Avatar billede arne_v Ekspert
23. september 2005 - 12:28 #1
du kan:

EXEC('SELECT TOP ' + @Filter + ' * FROM news')

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
Avatar billede agertoft Nybegynder
23. september 2005 - 12:56 #2
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... :)
Avatar billede claesdamlund Nybegynder
23. september 2005 - 13:32 #3
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.
Avatar billede agertoft Nybegynder
23. september 2005 - 13:59 #4
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...
Avatar billede agertoft Nybegynder
23. september 2005 - 14:00 #5
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å.
Avatar billede claesdamlund Nybegynder
23. september 2005 - 14:48 #6
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.
Avatar billede agertoft Nybegynder
23. september 2005 - 16:18 #7
claes, den der er for det første ikke fleksibel - der vil man jo binde sig på, at filtret er 10...

Jeg har kigget på:
http://www.wwwcoder.com/main/parentid/191/site/2124/68/default.aspx
men kan ikke rigtig få det til at virke... det giver mig ikke det rigtige resultat :-/
Avatar billede claesdamlund Nybegynder
23. september 2005 - 16:35 #8
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.
Avatar billede agertoft Nybegynder
23. september 2005 - 17:53 #9
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

    SET ROWCOUNT 0
GO
Avatar billede agertoft Nybegynder
23. september 2005 - 17:53 #10
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester