Avatar billede havmaage Juniormester
17. september 2009 - 21:12 Der er 4 kommentarer og
1 løsning

min cursor ser ikke ud til at loope i while statement

Hej jeg er ved at lære ms sql og stored procedure, triggers mm.
Jeg arbejder med en trigger der skal opdatere et felt antal i tabellen afdeling. jeg bruger en cursor til at tælle antal medlmer af en afdeling.
antal feltet bliver faktisk opdateret ved insert, men den bliver sat til 0 ( ikke null)

PS. jeg har læst en masse om at cursor er meget resource krævende og langsom, noget man skal prøve at undgå, men jeg vil nu gerne lære at bruge det alligevel :-)

kode
TRIGGER opdate_antal
  ON  afdeling
  AFTER insert
AS
BEGIN
    SET NOCOUNT ON;

declare @afdnr smallint   

declare pegefinger CURSOR for
    select afdnr from AFDELING
    open pegefinger

    FETCH  pegefinger into  @afdnr

    WHILE @@FETCH_STATUS = 0 BEGIN
        update AFDELING   
    set antal = (select COUNT(*) from MEDLEM where afdnr = @afdnr)

        FETCH NEXT FROM pegefinger into @afdnr
    END --WHILE
    close pegefinger
    deallocate pegefinger
END
GO
Avatar billede Syska Mester
17. september 2009 - 22:13 #1
Det er ved insert kan jeg se ... :-)

Har du prøvet at køre din CURSOR kode ... dvs unden at det er inde i din TRIGGER ?

For mig at se er der intet galt ...
Avatar billede havmaage Juniormester
17. september 2009 - 22:24 #2
har lige prøvet med følgende test sp

create procedure  test
 
 
AS
BEGIN
    --SET NOCOUNT ON;

declare @afdnr smallint   

declare pegefinger CURSOR for
    select afdnr from AFDELING
    open pegefinger
    FETCH NEXT FROM pegefinger   
    FETCH  pegefinger into  @afdnr

    WHILE @@FETCH_STATUS = 0 BEGIN
        update AFDELING   
    set antal = (select COUNT(*) from MEDLEM where afdnr = @afdnr)

        FETCH NEXT FROM pegefinger into @afdnr
    END --WHILE
    close pegefinger
    deallocate pegefinger
END
GO

den giver samme resultat desværre

derudover testede jeg lige min update statement igen
set antal = (select COUNT(*) from MEDLEM where afdnr = @afdnr)

jeg kan ikke se der er noget galt der, antal feltet burde blive opdateret med resultatet af select statement ikke ?
Avatar billede Syska Mester
17. september 2009 - 22:28 #3
ohhh ...

Den opdatere måske også ... men hvis din sidste afdeling har 0 brugere ... så forbliver den jo 0 ...

update AFDELING 
    set antal = (select COUNT(*) from MEDLEM where afdnr = @afdnr) WHERE afdeling = @afdnr

Du mangler din sidste WHERE på AFDELING.

Men vær klar over at det hele performer dårligt og der findes bedre måder ... men det lader til at det er et lærings projekt du har gang i ... :-)

// ouT
Avatar billede havmaage Juniormester
17. september 2009 - 22:47 #4
oh det virker.. fedt mange tak læg lige et svar
Avatar billede Syska Mester
17. september 2009 - 22:51 #5
svar
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