Avatar billede jobless Nybegynder
05. februar 2009 - 13:44 Der er 7 kommentarer og
1 løsning

Loop i sp

Hej.

Jeg har brug for hjælp til at lave en stored procedure.

Formålet er at jeg sender en fra- og til-dato til sp'en, og den returnerer et dataset med hver dato i perioden, samt et tal som skal hentes fra en tabel.

F.eks. hvis jeg sender '05-02-2009' og '10-02-2009' ind, vil jeg gerne have følgende ud:

05-02-2009|3
06-02-2009|1
07-02-2009|0
08-02-2009|null
09-02-2009|null
10-02-2009|4

De steder hvor der returneres null, findes der ikke en post i den pågældende tabel.

Er der en venlig sjæl der vil hjælpe mig igang, det er primært løkken og opbygning af resultat jeg har behov for hjælp til.
Avatar billede arne_v Ekspert
05. februar 2009 - 14:14 #1
Med meget stor sandsynlighed er en loekke i din SP ikke den rigtige maade at angribe problemet paa.

En banal SELECT WHERE BETWEEN og lad applikationen haandtere hullerne vil fungere meget bedre.

Hvis du vil bruge en loekkse, saa laver du en cursor over din SELECT og itererer over den.
Avatar billede jobless Nybegynder
05. februar 2009 - 14:17 #2
Ok, tak.

Det vil jeg lige forsøge først, og evt. vende tilbage
Avatar billede HenrikSjang Nybegynder
06. februar 2009 - 19:33 #3
Jeg har tit brugt denne konstruktion til ad hoc udtræk af den type:

SET NOCOUNT ON

CREATE TABLE #Data
(
    Id int IDENTITY PRIMARY KEY,
    Dato datetime,
    SomeNumber int
)

DECLARE @StartTid datetime, @SlutTid datetime
DECLARE @SomeNumber integer


SET @StartTid = '2009-02-05'
SET @SlutTid = '2009-02-10'

WHILE (@StartTid <= @SlutTid)
BEGIN
    SELECT
    @SomeNumber = Count(*) --Ret denne til det tal du vil slå op
    FROM EnTabel --Ret denne til den tabel du vil slå op i
    WHERE (TimestampColumn between @StartTid and DATEADD(minute, 1440, @StartTid)) --Ret TimestampColumn til det kolonnenavn i din tabel, som indeholder en datetime
    INSERT INTO #SearchTimes (Dato, SomeNumber)
    VALUES (@StartTid, @SomeNumber)
    SET @StartTid = DATEADD(minute, 1440, @StartTid)
END

SELECT *
FROM #Data
Avatar billede kentjohansen Nybegynder
09. februar 2009 - 18:20 #4
Eller:
SELECT Datecol, COUNT(*) FROM enTable WHERE Datecol BETWEEN @StartTid AND @SlutTid GROUP BY Datecol
Avatar billede jobless Nybegynder
11. februar 2009 - 10:57 #5
Jeg har fiflet lidt med sjang's foreslag, og det ser næsten rigtigt ud, men jeg har et problem med løkken:

WHILE (@StartTid <= @SlutTid)
    BEGIN
        SELECT
        @iPladser = Pladser
        FROM tblPladser
        WHERE (dato between @StartTid and DATEADD(minute, 1440, @StartTid)) AND Depot = @iDepot
        INSERT INTO #Data (Dato, Pladser)
        VALUES (@StartTid, @iPladser)
        SET @StartTid = DATEADD(minute, 1440, @StartTid)
    END

Problemstillingen er, at første gang den møder en record i tabellen 'tblPladser' så gentager den tallet de efterfølgende datoer, hvis den ikke finder en post på disse. Mit ønske er at den skal returnere null hvis der ikke er en post.
Avatar billede jobless Nybegynder
11. februar 2009 - 11:05 #6
Ok, fik selv løst det vha. en Group By
Avatar billede jobless Nybegynder
16. februar 2009 - 07:34 #7
sjang: lægger du et svar ?
Avatar billede HenrikSjang Nybegynder
16. februar 2009 - 17:49 #8
kommer her.
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