[sql] sql vereenvoudigen

Pagina: 1
Acties:

  • Tinuske
  • Registratie: September 2002
  • Laatst online: 08-02 20:43
Onderstaande functie gebruik ik voor paging

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
parameters toevoegen:
   @statusid int,    
   @Pagenumber int,
   @PageSize int,
   @SortBy varchar(100) 

)
as
begin
   set nocount on
   declare @TotalRows int 
   declare @FirstSelectingRow int 
   declare @LastSelectingRow int

   select @TotalRows = 
(count(bedrijfid) from bedrijven where bedrijfstatus = @statusid )

   select @FirstSelectingRow = (@Pagenumber - 1) * @PageSize + 1

   if (@FirstSelectingRow <= @TotalRows)
   begin
      set rowcount @FirstSelectingRow
      select @FirstSelectingRow = (select * from bedrijven
      where bedrijfstatus = @statusid
      Order By
    CASE WHEN @SortBy='Achternaam' THEN CONVERT(char(50), Achternaam) + CONVERT(char(50), Voornaam)
       WHEN @SortBy='Salaris' THEN CONVERT(varchar(50), Salaris)
       WHEN @SortBy='ID' THEN ID      

      set rowcount @PageNumber
     select * from bedrijven where bedrijfstatus = @statusid) 
      where primarykey >= @FirstSelectingRow  
      Order By
CASE WHEN @SortBy='Achternaam' THEN CONVERT(char(50), Achternaam) + CONVERT(char(50), Voornaam)
       WHEN @SortBy='Salaris' THEN CONVERT(varchar(50), Salaris)
       WHEN @SortBy='ID' THEN ID       
   end
   set nocount off
end


Is er een manier om deze te vereenvoudigen, want zoals je ziet zitten er hierin 3 op gelkaar gelijkende sql's. Aangezien sommige van deze sql's iets van 50 pagina's zijn, wordt het al snel onoverzichtelijk . Hoe is dit overzichtelijker te maken ?

  • whoami
  • Registratie: December 2000
  • Laatst online: 21:00
Kan je niets doen met een TOP clausule icm een ORDER BY en een WHERE [sortveld] > laatste_waarde_vorige_page

https://fgheysels.github.io/


  • Tinuske
  • Registratie: September 2002
  • Laatst online: 08-02 20:43
Je krijgt dan zoiets -> (Alsnog 3 x ongeveer dezelfde SQL dus)
en dit is bovendien ook nog trager :

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
DECLARE @sql NVARCHAR(1024)  
 
    SET @sql = N'SELECT 
            ArtistName, 
            Title 
        FROM  
        (  
            SELECT TOP '+RTRIM(@perpage) 
                +' ArtistName, 
                Title 
            FROM  
            ( 
                SELECT TOP '+RTRIM(@perpage*@pagenum) 
                    +' ArtistName, 
                    Title 
                FROM 
                    SampleCDs WITH (NOLOCK) 
                ORDER BY 
                    ArtistName+''~''+Title 
            ) a  
            ORDER BY 
                ArtistName+''~''+Title DESC 
        ) b  
        ORDER BY 
            ArtistName+''~''+Title' 
 
    EXEC sp_executeSQL @sql

  • d00d
  • Registratie: September 2003
  • Laatst online: 16-09-2025

d00d

geen matches

De volgende pseudocode kan misschien gaan werken?

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
create table #temp (
    id int identity,
    col1 datatype1,
    col2 datatype2,
    col n datatype n)

insert into #temp (columns)
    select top (@pageNumber * @pageSize)
    from table
    order by @sortby

select <columns>
from #temp
where id between
    ( (@pagenumber * @pagesize) - @pagesize 
    AND (@pagenumber * @pagesize) )
order by id

42.7 percent of all statistics are made up on the spot.