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?