Avatar billede dotnet_cowboy Nybegynder
26. september 2005 - 13:09 Der er 10 kommentarer og
1 løsning

paging og search i samme sproc

Hejsa...

Jeg har et problem med et kombinere en search og paging ved hjælp af en temptabel.

Probelemter ligger i at kombinere en dynamisk sql streng med en Create Tabel command i samme sproc.

Jeg bruger _sp_executesql system sproc, som tager selve sql strengen som første parameter og en parameterliste som anden parameter.

Min sproc ser således ud:

------------------------------------------------

CREATE PROCEDURE search_orders_1                                     
(@StatusID INT,
@OrderID INT,
@UnionID INT,
@Text VARCHAR(256),
@Date CHAR(19),
@CurrentPage INT,
@PageSize INT,
@debug BIT = 0)
AS                 

SET NOCOUNT ON

DECLARE @sql nvarchar(4000), @paramlist  nvarchar(4000)

SET @sql = N' CREATE TABLE #TempTable
    ([ID]  INT IDENTITY PRIMARY KEY,
    Forening VARCHAR(100),
    Ordreid INT,
    Kundenummer VARCHAR(100),
    FO VARCHAR(8),
    Beskrivelse VARCHAR(80),
    Ordretype VARCHAR(100),
    Udfoeres DATETIME,
    Udfoert DATETIME,
    BEM VARCHAR(2000),
    LejlighedsId INT,
    Agent VARCHAR(30),
    AbbBeskr VARCHAR(100),
    Navn VARCHAR(100),
    KontaktNr VARCHAR(100),
    Gade VARCHAR(100),
    Nr VARCHAR(100),
    Etage VARCHAR(100),
    PostNr VARCHAR(100),
    Bynavn VARCHAR(100))

    INSERT INTO #TempTable
    (Forening, Ordreid, Kundenummer, FO, Beskrivelse, Ordretype, Udfoeres, Udfoert, BEM, LejlighedsId, Agent, AbbBeskr, Navn, KontaktNr, Gade, Nr, Etage, PostNr, Bynavn)   
   
    SELECT F.Navn As Forening, O.Ordreid, O.Kundenummer, O.FO, O.Beskrivelse, O.Ordretype, O.Udfoeres, O.Udfoert, O.BEM, O.LejlighedsId, O.Agent, A.Beskrivelse AS AbbBeskr, K.Navn, K.KontaktNr, L.Gade, L.Nr, L.Etage, L.PostNr, L.Bynavn
    FROM ORDRER O
    LEFT JOIN Kunder K ON (K.Kundenummer = O.KundeNummer)
    LEFT JOIN Lejlighed L ON (L.ID = K.LejlighedsId)
    LEFT JOIN Forening F ON (F.FO = K.FO)
    LEFT JOIN Abbtyper A on (K.ABB_TV = A.AbbId)        
    WHERE (Ordreklasse = 2 AND 1 = 1)'
                                               
    IF @StatusID IS NOT NULL                                               
    SELECT @sql = @sql + ' AND O.Status = @xstatusid'
                                                                             
    IF @OrderID IS NOT NULL                                               
    SELECT @sql = @sql + ' AND O.OrderID = @xorderid'   

    DECLARE @FirstRec INT
    DECLARE @LastRec INT
    SELECT @FirstRec = (@CurrentPage - 1) * @PageSize
    SELECT @LastRec = (@CurrentPage * @PageSize + 1)
           
    SELECT @sql = @sql + ' FROM tbl SELECT [ID], Forening, Ordreid, Kundenummer, FO, Beskrivelse, Ordretype, Udfoeres, Udfoert, BEM, LejlighedsId, Agent, AbbBeskr, Navn, KontaktNr, Gade, Nr, Etage, PostNr, Bynavn
    FROM  #TempTable
    WHERE [ID] > ' + @FirstRec + '
    AND [ID] < ' + @LastRec
                                                                             
    IF @debug = 1                                                       
    PRINT @sql                                                       
                                                                             
    SELECT @paramlist = '@xstatusid INT, @xorderid INT'                     
                                                                           
    EXEC sp_executesql @sql, @paramlist, @StatusID, @OrderID

------------------------------------------------

Håber nogen kan hjælpe mig.

Mvh

DC
Avatar billede -mundi- Nybegynder
26. september 2005 - 13:29 #1
Nogen speciel grund til at du bruger en tmp tabel ?
Avatar billede dotnet_cowboy Nybegynder
26. september 2005 - 13:50 #2
tjooo... for det første er det i temptabellen jeg der bliver genereret et INDEX ID felt, som jeg så i min SELECT statement bruger til at bladre med og så er det den fremgangsmåde indtil videre jeg hat testet med bedst performance.

Hvis der er andre fremgangsmåder, der er lige så gode som ved hjælp af en temptabel så vil jeg meget gerne se dem.
Avatar billede -mundi- Nybegynder
26. september 2005 - 13:59 #3
Kan være den her kan hjælpe ?
http://www.codeproject.com/aspnet/PagingLarge.asp
Avatar billede dotnet_cowboy Nybegynder
27. september 2005 - 10:02 #4
God morgen Mundi...

Nu har jeg prøvet mig frem med de eksempler som bliver præsenteret i ovenstående link.

Det ser rigtig godt ud, men svartiderne er alt for lange på dem alle sammen. Jeg ved ikke hvordan forfatteren af artiklen for hans svartider ned på dem han skriver i hans excel ark. Jeg kan udmiddelbart ikke bruge dem til noget. Lidt ærgeligt for det er ellers et godt gennemtænkt stykke arbejde.

Har du andre kort på hånden.

Se min nuværende fremgangsmåde er min TempTable. Det er hurtigt og relativt lige til at gå til. Jeg smider så resultatet af min forspørgsel i et dataset og bruger datasetets DataView obj. til at sort på.

Det er fint nok, men i og med at det jo kun er det data som er blevet trukket ud af dab'en der bliver sortet på, så vil man jo opleve en usorteret grid efter en paging forspørgsel.

Det er ikke optimalt.
Avatar billede dotnet_cowboy Nybegynder
27. september 2005 - 10:18 #5
Det skal lige siges at jeg kørte en kørsel hvor med jeg indsatte 1 mill. rækker. For at teste på en stor datamængde, ligesom forfatteren af artiklen.

:-)
Avatar billede -mundi- Nybegynder
27. september 2005 - 10:18 #6
Underligt med de langesvartider, Måske mangler der nogen index eller noget.
Hvor mange records er der i tabellerne ?
Avatar billede dotnet_cowboy Nybegynder
27. september 2005 - 10:19 #7
1 mill. records
Avatar billede dotnet_cowboy Nybegynder
27. september 2005 - 10:20 #8
Har du selv erfaring med udvikling af custom paging og sorting i web apps?
Avatar billede dotnet_cowboy Nybegynder
27. september 2005 - 10:23 #9
Jeg ved ikke hvor underligt det er at der er lange svartider.

Der bliver jo kørt en SELECT Count(ID) i Page_Load

----------

Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
        DataGrid1.VirtualItemCount = CType(SqlHelper.ExecuteScalar(conStr, CommandType.Text, "SELECT Count(*) FROM LargeTable"), Integer)
        If Not Page.IsPostBack Then
            BindGrid(PageNumber)
        End If
    End Sub

----------

Det tager da sin tid at tælle så mange records. Hehe
Avatar billede -mundi- Nybegynder
27. september 2005 - 10:52 #10
Jeg har selv lavet en del custompaging, men har ikke fundet mig en favorit endnu :-/
Avatar billede dotnet_cowboy Nybegynder
29. september 2005 - 11:50 #11
jeg fandt selv en løsning...

men tak for svarene ellers.
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



IT-JOB

Sentia Denmark A/S

Service Delivery Manager

Politiets Efterretningstjeneste

Bliv AD-specialist hos PET

Erhvervsakademi Aarhus

Underviser til it-teknologuddannelsen

Udviklings- og Forenklingsstyrelsen

Udbudsjurist til Danmarks største IT-udbud

Metro Service A/S

Erfaren IT-supporter