Avatar billede mireigi Novice
27. april 2009 - 10:37 Der er 2 kommentarer og
1 løsning

Hjælp til cursors

Hej eksperter.
Jeg er i gang med at lave nyhedsfeed på en hjemmeside, hvor egne nyheder bliver suppleret med nyheder fra Ritzau. Til det formål modtager og gemmer jeg nyheder fra Ritzau i en database sammen med egne nyheder.

Nu vil jeg så gerne have en mest læste funktion på hjemmesiden, og har lavet en stored procedure der beregner sig frem til mest læste og gemmer dem i en tabel hver 10ende minut, hvor hjemmesiden så henter top 10 mest læste fra.

Jeg bruger følgende tabeller:
t_Nyheder - Her er nyhederne
t_NyhedsHits - Hver IP bliver logget her for hver visning af en nyhed.
t_Nyheder_Mest_Laeste - Her gemmes en reference til de mest læste nyheder når SP'en er færdig.
@t_Temp - Her gemmes en reference til de mest læste nyheder indtil SP'en er færdig.
@t_Overkategori - En tabel med ID'numre på de overordnede kategorier for nyhederne


Min stored procedure ser sådan ud:
---------------------------------------------------
USE [xxxxxxxxxxxxxxx]
GO
/****** Object:  StoredProcedure [dbo].[stp_Beregn_Mest_Laeste]    Script Date: 04/27/2009 09:50:26 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[stp_Beregn_Mest_Laeste]
AS
BEGIN
    SET NOCOUNT ON;
   
    DECLARE @limit int
    SET @limit = 2880

    DECLARE @overkategori int
    DECLARE @kategori int

    DECLARE @ritzauKategori varchar(100)
    DECLARE @ritzauKategori2 varchar(100)
   
    DECLARE @t_Temp TABLE
    (Overkategori int,
    Kategori int,
    Nyhed int,
    Overskrift varchar(100),
    Ritzau varchar(100),
    Headline varchar(100),
    Hits int,
    Dato datetime)
   
    DECLARE @t_Overkategori TABLE
    (Overkategori int)
    INSERT INTO @t_Overkategori VALUES(1)
    INSERT INTO @t_Overkategori VALUES(2)
    INSERT INTO @t_Overkategori VALUES(3)
    INSERT INTO @t_Overkategori VALUES(4)

    DECLARE overkategori_cursor CURSOR FOR SELECT * FROM @t_Overkategori ORDER BY Overkategori ASC

    OPEN overkategori_cursor
    FETCH NEXT FROM overkategori_cursor INTO @overkategori

    WHILE @@FETCH_STATUS = 0
    BEGIN
        DECLARE kategori_cursor CURSOR FOR SELECT KategoriID FROM t_Kategori WHERE (Overkategori = @overkategori) ORDER BY KategoriID ASC

        OPEN kategori_cursor
        FETCH NEXT FROM kategori_cursor    INTO @kategori

        WHILE @@FETCH_STATUS = 0
        BEGIN
            SET @ritzauKategori = ''
            SET @ritzauKategori2 = ''
            IF @kategori = 46
                BEGIN
                    SET @ritzauKategori = 'I'
                    SET @ritzauKategori2 = 'P'
                END

            IF @kategori = 47
            BEGIN
                SET @ritzauKategori = 'U'
                SET @ritzauKategori2 = 'U'
            END

            IF @kategori = 48
            BEGIN
                SET @ritzauKategori = 'K'
                SET @ritzauKategori2 = 'K'
            END

            IF @kategori = 21
            BEGIN
                SET @ritzauKategori = 'S'
                SET @ritzauKategori2 = 'S'
            END

            INSERT INTO @t_Temp (Overkategori, Kategori, Nyhed, Overskrift, Hits, Dato)
                SELECT TOP 10 @Overkategori, @Kategori, ID, Rubrik, (SELECT COUNT(t_NyhedsHits.NyhedsID) FROM t_NyhedsHits WHERE (t_NyhedsHits.NyhedsID = t_Nyheder.ID)) AS Hits, datoonline
                FROM t_Nyheder
                WHERE (Kategori = @kategori) AND (DATEDIFF(Minute, datoonline, GETDATE()) >= 0) AND (DATEDIFF(minute, datoonline, GETDATE()) <= @limit) AND (NOT(ID IN (SELECT Nyhed FROM @t_Temp)))
                ORDER BY Hits DESC

            INSERT INTO @t_Temp (Overkategori, Kategori, Ritzau, Headline, Hits, Dato)
                SELECT TOP 10 @Overkategori, @Kategori, ID, Headline, Hits, Date
                FROM t_Ritzau_Newsfeed
                WHERE ((Category = @ritzauKategori) OR (Category = @ritzauKategori2)) AND (DATEDIFF(minute, Date, GETDATE()) >= 0) AND (DATEDIFF(minute, Date, GETDATE()) <= @limit)
                ORDER BY Hits DESC
        END
        CLOSE kategori_cursor
        DEALLOCATE kategori_cursor
        FETCH NEXT FROM overkategori_cursor INTO @overkategori
    END
    CLOSE overkategori_cursor
    DEALLOCATE overkategori_cursor
   
    DELETE FROM t_Nyheder_Mest_Laeste
    INSERT INTO t_Nyheder_Mest_Laeste
        SELECT * FROM @t_Temp
END

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

Der sker bare ikke ret meget. Efter 5-6 minutter er tabellen "t_Nyheder_Mest_Laeste" stadig tom, og der er kommer en masse posts i tabellen "@t_Temp". Jeg er godtnok ikke nogen haj til cursors, men det burde vel ikke tage særligt lang tid når tabellen "t_NyhedsHits" er tom?

Er der nogen der kan hjælpe mig her?
Avatar billede aaberg Nybegynder
27. april 2009 - 11:03 #1
Så vidt jeg kan se, glemmer du at kalde FETCH NEXT inde i din while-løkke, så den suser bare rundt i en uendelig løkke, og fylder @t_temp med data. Den går aldrig videre til næste row.
Avatar billede mireigi Novice
27. april 2009 - 11:07 #2
Jamen du er da en skattertøs! :D

Det virker perfekt nu og tager < 2 sekunder at eksekvere.
Smider du et svar så får du lige point :D
Avatar billede aaberg Nybegynder
27. april 2009 - 11:42 #3
:-)
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