[mssql]funkcja, Insert, ststystki

Odpowiedz Nowy wątek
2010-03-20 17:37
niewiadomy777
0

Witam,

Chciałbym zrobić zliczanie punktow z jednej tabeli i podzilić to na grupy z predzialami punktowymi i wyniki wrzucic do innej tabeli. Napisałem coś takiego ale nie działa. Pytanie dlaczego, i jak to poprawić aby działało. Z gory dzięki

create function statystyki
(
    @trzy int,
    @szesc int,
    @reszta int
)
RETURNS int
as

begin

declare 

    @cos int,
    @kursor Cursor,
    @punkty int

    set @cos = 1
    set @trzy =0 
    set @szesc =0
    set @reszta = 0
    set @kursor = cursor for(Select Points from tblUser)

open @kursor
Fetch next from @kursor into @punkty

while(@@Fetch_status =0)

begin

    if(@punkty<3)
            set @trzy = @trzy+1
    else if ((@punkty>2)and(@punkty<7))
            set @szesc= @szesc +1
    else
            set @reszta= @reszta+1

    fetch next from @kursor into @punkty

end

  insert into staty(do3,od3do6,od7do10) values (@trzy, @szesc,@reszta)
  return 1

end

</email>

Pozostało 580 znaków

2010-03-20 18:14
1

A takie cos nie lepiej?

select count(*) from tblUser where Points < 3;
select count(*) from tblUser where Points between 3 and 6;
select count(*) from tblUser where Points > 6;

You need to learn how to walk
before you can run

Pozostało 580 znaków

2010-03-20 19:24
nieznajomy777
0

Msg 444, Level 126, State 2, Procedure statystyki, Line 124
Select statements included within a function cannot return data to a client

A wolge wrzucić potem wynik zapytania do zmiennej

set @zmienna = zapytanie ?

Pozostało 580 znaków

2010-03-20 21:18
0

select @zmienna = count(*) ...

A blad wkleiles, bo?


You need to learn how to walk
before you can run

Pozostało 580 znaków

2010-03-20 22:34
nieobeznany412
0

Skoro juz funkcja mi sie skompilowala ma jeden parametr @ile varchar(20) to ja to wywołać ?
Bo jak piszę
execute nazwa('cos') to twierdzi ze Incorrect syntax near 'cos'.

Jak to poprawnie wywołać , Zwracam zmienna typu varchar(20) w ktorej jest napis jakiś ;]
</email>

Pozostało 580 znaków

2010-03-20 22:37
0

Ech..., co to bedzie, jak google upadnie [glowa]

select user.fun('param1')


You need to learn how to walk
before you can run

Pozostało 580 znaków

2010-03-20 22:47
asda
0

tak też robilem ale niestesty dostałem bład

Msg 557, Level 16, State 2, Line 1
Only functions and extended stored procedures can be executed from within a function.

co z tym mozna zrobic ?

Pozostało 580 znaków

2010-03-20 22:51
0

Co wlasciwie starasz sie zrobic z ta funkcja? Bo mam wrazenie, ze nie widze calego obrazu sytuacji.


You need to learn how to walk
before you can run

Pozostało 580 znaków

2010-03-20 23:00
asda
0

oto kod:


create function lol2
(
    @ile nvarchar(20)
)
RETURNS varchar(20) 
as
begin
    declare @trzy int
    declare @szesc int
    declare @reszta int
    declare @napis nvarchar(20) 
    set @napis = 'costam'
    DECLARE @query nvarchar(4000)

    SELECT @trzy= count(*) FROM tblUser WHERE Points < 3;
    SELECT @szesc= count(*) FROM tblUser WHERE Points BETWEEN 3 AND 6;
    SELECT @reszta = count(*) FROM tblUser WHERE Points > 6;

    SET @query ='Insert into staty(od3,od3do6,od7do10) values(@trzy,@szesc,@reszta)';
    exec sp_executesql @query

return @napis

end

to ma zliczac mi ile jest teamtow ponizej 3 pkt ile od 3 do 7 i tak dalej ... i wrzucac do innej tabeli te dane
oto co ;]
sory ale dopiero ucze sie ssql i mam pewne braki jeszcze takze sorki za swoj laicyzm w temacie

Pozostało 580 znaków

2010-03-20 23:03
0

Ekhem... Skad pomysl na budowanie dynamicznego sqla, do tego zreszta niepoprawnie?

Wystarczy samo

Insert into staty(od3,od3do6,od7do10)  values(@trzy,@szesc,@reszta)

You need to learn how to walk
before you can run

Pozostało 580 znaków

2010-03-20 23:13
sdfghj
0

stąd pomysł że jak statycznie chcialem to wrzucić to dostawałem coś takiego

Msg 443, Level 16, State 15, Procedure lol2, Line 24
Invalid use of side-effecting or time-dependent operator in 'INSERT' within a function.

dlatego dynamicznie ... wrzucilem twoj kod ale dalej nie działa ;]

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0