Avatar billede hanstad Nybegynder
25. juni 2003 - 10:54 Der er 17 kommentarer og
1 løsning

Count i sp

Jeg er temmelig ny indenfor sp, men jeg har lavet følgende kode som skal lave nogle summer for to opslag. Hvis jeg kører sp i SQL Query Analyser, så fungerer det som det skal jeg får retuneret antalord. Men så snart jeg afvikler det fra min asp-side får jeg følgende fejl:
Multiple-step OLE DB operation generated errors. Check each OLE DB status value, if available. No work was done.

Min sp-kode er:
CREATE PROCEDURE dbo.sp_TaelLemmaIaltDk

@par_lemmaDK varchar(125)

AS

declare @antal int, @x int

set @antal = 0

declare cursor_Uden cursor

for (select count(distinct lemmauk) as antal
from tbllemma
where lemmadk = @par_lemmaDk and polysemiuk = 0
group by ordklasseuk, pluralisuk, emneuk, geouk)

open cursor_Uden
FETCH NEXT FROM cursor_Uden
INTO @x

while @@FETCH_STATUS=0
begin
    FETCH NEXT FROM cursor_Uden
    INTO @x
    set @antal = @antal + @x
end

declare cursor_Med cursor
for (Select count(distinct lemmauk)
from tbllemma
where lemmadk = @par_lemmaDk and polysemiuk <> 0
group by ordklasseuk, pluralisuk, emneuk, geouk)

open cursor_Med
FETCH NEXT FROM cursor_Med
INTO @x

while @@FETCH_STATUS=0
begin
    FETCH NEXT FROM cursor_Med
    INTO @x
    set @antal = @antal + @x
end

close cursor_Uden
deallocate cursor_Uden
close cursor_Med
deallocate cursor_Med

select @antal as AntalOrd
GO


Er der nogen der kan hjælpe mig?
Avatar billede bennytordrup Nybegynder
25. juni 2003 - 11:03 #1
CREATE PROCEDURE dbo.sp_TaelLemmaIaltDk

@par_lemmaDK varchar(125)

AS

set nocount on

declare @antal int, @x int

set @antal = 0

declare cursor_Uden cursor

for (select count(distinct lemmauk) as antal
from tbllemma
where lemmadk = @par_lemmaDk and polysemiuk = 0
group by ordklasseuk, pluralisuk, emneuk, geouk)

open cursor_Uden
FETCH NEXT FROM cursor_Uden
INTO @x

while @@FETCH_STATUS=0
begin
    FETCH NEXT FROM cursor_Uden
    INTO @x
    set @antal = @antal + @x
end

declare cursor_Med cursor
for (Select count(distinct lemmauk)
from tbllemma
where lemmadk = @par_lemmaDk and polysemiuk <> 0
group by ordklasseuk, pluralisuk, emneuk, geouk)

open cursor_Med
FETCH NEXT FROM cursor_Med
INTO @x

while @@FETCH_STATUS=0
begin
    FETCH NEXT FROM cursor_Med
    INTO @x
    set @antal = @antal + @x
end

close cursor_Uden
deallocate cursor_Uden
close cursor_Med
deallocate cursor_Med

set nocount off
select @antal as AntalOrd
Avatar billede hanstad Nybegynder
25. juni 2003 - 11:25 #2
nope... samme fejl :-(
Avatar billede hanstad Nybegynder
25. juni 2003 - 11:26 #3
Hvad betyder
set nocount on
og
set nocount off
???
Avatar billede bennytordrup Nybegynder
25. juni 2003 - 11:31 #4
set nocount on får SQL Server til at undlade at give informationer tilbage til klienten om antal rows, der er berørt af hvert enkelt sql statement.
Avatar billede bennytordrup Nybegynder
25. juni 2003 - 11:31 #5
CREATE PROCEDURE dbo.sp_TaelLemmaIaltDk

@par_lemmaDK varchar(125)

AS

set nocount on

declare @antal int, @x int

set @antal = 0

declare cursor_Uden cursor

for (select count(distinct lemmauk) as antal
from tbllemma
where lemmadk = @par_lemmaDk and polysemiuk = 0
group by ordklasseuk, pluralisuk, emneuk, geouk)

open cursor_Uden
FETCH NEXT FROM cursor_Uden
INTO @x

while @@FETCH_STATUS=0
begin
    set @antal = @antal + @x

    FETCH NEXT FROM cursor_Uden
    INTO @x
end

declare cursor_Med cursor
for (Select count(distinct lemmauk)
from tbllemma
where lemmadk = @par_lemmaDk and polysemiuk <> 0
group by ordklasseuk, pluralisuk, emneuk, geouk)

open cursor_Med
FETCH NEXT FROM cursor_Med
INTO @x

while @@FETCH_STATUS=0
begin
    set @antal = @antal + @x

    FETCH NEXT FROM cursor_Med
    INTO @x
end

close cursor_Uden
deallocate cursor_Uden
close cursor_Med
deallocate cursor_Med

set nocount off
select @antal as AntalOrd
Avatar billede janus_007 Nybegynder
25. juni 2003 - 11:31 #6
Forklar hvad det er du vil have summeret ??. Kan næsten ikke tro det er nødvendigt med en cursor *S*
Avatar billede bennytordrup Nybegynder
25. juni 2003 - 11:32 #7
Din sp ville ikke tælle med for den første post i hver cursor. Desuden ved jeg ikke hvad, status ville blive på den sidste post.
Avatar billede hanstad Nybegynder
25. juni 2003 - 11:43 #8
Jeg har en tabel med en række ord, hvor felterne ordklasseuk, pluralisuk, emnuuk og geouk nogen gange er ens og andre gange er forskellig fra hinanden mellem to records.
Det jeg ønsker er at tjekke hvor mange poster, der er hvor de fire felter er forskellige fra hinanden.
Jeg laver opslaget to gange da polysemiuk både kan være <> 0 og =0. Det kan IKKE lade sig gøre at undlade where polysemi-sætningen da der er stor forskel for om polysemi er lig nul eller ej.

Er det forståligt? eller så bare sig til
Avatar billede hanstad Nybegynder
25. juni 2003 - 11:44 #9
det med at min sp ikke tæller den første record med, er ikke korrekt. Det gør den (i hvertfald) i query analyser
Avatar billede bennytordrup Nybegynder
25. juni 2003 - 11:50 #10
hanstad >> Se på følgende stump fra din sp:

declare @antal int, @x int

set @antal = 0

declare cursor_Uden cursor

for (select count(distinct lemmauk) as antal
from tbllemma
where lemmadk = @par_lemmaDk and polysemiuk = 0
group by ordklasseuk, pluralisuk, emneuk, geouk)

open cursor_Uden
FETCH NEXT FROM cursor_Uden
INTO @x

while @@FETCH_STATUS=0
begin
    FETCH NEXT FROM cursor_Uden
    INTO @x
    set @antal = @antal + @x
end



Du åbner cursoren og henter første post ind i @x via FETCH NEXT. Derefter looper du så længe, @@fetch_status = 0. Inde i løkken laver du en FETCH NEXT igen, og derefter bruger du værdien af @x. Men den værdi, der blev hentet til @x uden for løkken, er forsvundet. Desuden, når du kommer til bunden af tabellen, vil du lave en fetch next, som mislykkes, da der ikke er flere poster. Derefter har du en måske ugyldig værdi i @x
Avatar billede bennytordrup Nybegynder
25. juni 2003 - 11:50 #11
en FETCH NEXT skal altid (IMO) være sidste statement i en while løkke mht. cursors.
Avatar billede hanstad Nybegynder
25. juni 2003 - 11:57 #12
Jeg kan godt se logikken i det du siger. Men fjerne jeg nu den fetch som står oven for løkken, så kommer jeg aldrig ind i løkken. - Derfor skrev jeg denne.
Jeg har i øvrigt nu byttet om i løkken, så den kører en fetch til sidst
Avatar billede janus_007 Nybegynder
25. juni 2003 - 12:01 #13
Jeg ville nok gøre sådan her:

SELECT SUM(a.antal)
FROM tbllemma,(select count(distinct lemmauk) as antal
    FROM tbllemma
    where lemmadk = @par_lemmaDk and polysemiuk = 0
    group by ordklasseuk, pluralisuk, emneuk, geouk) AS a

og så det samme for polysemiuk <> 0
Avatar billede hanstad Nybegynder
25. juni 2003 - 12:12 #14
Jeg har lige fundet min fejl...... Som sagt er jeg ny i faget og jeg havde ikke sat min permissions rigtigt op. :-(
Det er sku da også en underlig fejl at få bare pga. en permission
Avatar billede bennytordrup Nybegynder
25. juni 2003 - 12:13 #15
ADO kan være en sjov fætter med fejlmeddelelser :-)
Avatar billede hanstad Nybegynder
25. juni 2003 - 12:23 #16
Hvad skal vi gøre med point? Er det ok med Janus 007 at jeg giver alle point til Benny.tordrup?
Avatar billede janus_007 Nybegynder
25. juni 2003 - 12:56 #17
Tror vist man plejer at give point til løsningens ophavsmand, i det her tilfælde Benny!

Men tjek min løsning, hvis du får tid, jeg er af den overbevisning at alt der kan undgåes at laves med cursors skal bruges :O)

Jeg blandede mig også bare lidt...

Hygge
Avatar billede hanstad Nybegynder
25. juni 2003 - 12:59 #18
At du blander dig er jo netop det, som gør forummet genialt. Jeg ser på din løsning en anden dag. Tak for hjælpen begge to.
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