Avatar billede tuctoh Nybegynder
04. august 2003 - 16:28 Der er 5 kommentarer og
2 løsninger

At loope igennem et recordset - underlig fejl.

Hej,

Jeg har i mange timer nu siddet og roddet med et meget underligt problem synes jeg.

Får at i kan se hvad der er i de forskellige databaser, har jeg taget screenshots når jeg kører queryen i query analyzer.

Når jeg kører:
SELECT chance, itemid FROM m_itemdrops WHERE rid = @rid ORDER BY chance asc
får jeg:
www.secretsofwar.net/hotcut/sql1.jpg

Jeg vil også komme med screenshots af de egentlige problemer, længere nede.

Jeg har denne kode i en Stored Procedure:

------------------------------------
DECLARE @RN DECIMAL(5,2)
SET @RN = Rand()*100
DECLARE @drop_chance  DECIMAL(5,2)

DECLARE items CURSOR LOCAL FOR
SELECT chance, itemid FROM m_itemdrops WHERE rid= @ridORDER BY chance asc

OPEN items

SET @drop_chance = 0
DECLARE @i int
SET @i = 0
DECLARE @chance  DECIMAL(5,2)
DECLARE @itemid int

WHILE (@@FETCH_STATUS = 0 AND @drop_chance < @RN)
BEGIN
FETCH NEXT FROM items INTO @chance, @itemid
SET @i = @i+1
SET @drop_chance = @drop_chance + @chance
END
CLOSE items
DEALLOCATE items

SELECT
itemid = @itemid,
i=@i,
RN=@RN,
chance=@chance,
drop_chance=@drop_chance,
FETCH_STATUS=@@FETCH_STATUS

-----------------------------------------------


Det koden skal gøre, er at vælge en tilfældig linie i tabellen "m_itemdrops", og lave noge ændringer ved denne.
Den tilfældige linie skal udvælges efter nogle procenter; her er der 4 linier med hver 25%'s chance, men det kunne lige så godt være 2 med 10%'s chance, samt én med 80 etc...


Så vidt jeg kan se på den kode ovenover, burde dette virke.
Mit problem er dog, at så snart @RN er over 50 sker dette:
www.secretsofwar.net/hotcut/sql2.jpg
hvilket giver et problem... den burde i dette tilfælde med RN omkring 52 jo give itemid til at være 6.

Hvis RN er under 50, kommer:
www.secretsofwar.net/hotcut/sql3.jpg
hvilket er hvad der er korrekt.



Er der nogen som kan forklare dette fænomen, og hjælpe mig med at finde en løsning??? Jeg fatter ikke hvorfor det ikke virker som det skal. Der kommer ikke nogen fejlmeddelelser eller lignende - kun at de forskellige variabler bliver NULL

Hvis i mangler yderligere information, så sig endelig til.
Avatar billede tuctoh Nybegynder
04. august 2003 - 17:03 #1
noget andet underligt er, hvis jeg for eksempel bruger:

SET @RN = Rand()*50
så RN aldrig er højere end 50

samt
SET @drop_chance = @drop_chance + @chance/2

virker det... hvordan kan det dog være at @RN ikke må blive mere end 50?
Avatar billede mjohansen Nybegynder
04. august 2003 - 17:06 #2
Jeg tror det er fordi din while kører ALLE records igennem!
Din While/fetch er ikke helt standard lavet. Normalt gør man sådan her:

OPEN items
FETCH items into ....
WHILE @@FETCH_STATUS = 0 ......
BEGIN
  ....statements...
  FETCH items into ....
END
--
Ellers får du NULLs når der ikke er flere records tilbage.
Avatar billede tuctoh Nybegynder
04. august 2003 - 17:22 #3
ja, sådan startede jeg... grunden til at jeg valgte den anden metode, var at de 2 variabler jeg henter med FETCH items... gerne skulle kunne bruges EFTER at loopet er afsluttet.
Dette skulle kunne klares ved mit første eksempel.

Min påstand angående at hvis SET @RN = Rand()*50 er forkert... den giver stadig fejl, denne gang ved 25 :( dvs. halvdelen af recordsettet igennem.

Er der noget galt med min kode, eller..?
Avatar billede tuctoh Nybegynder
04. august 2003 - 17:26 #4
ok, ser ud til at jeg da har fundet lidt af fejlen selv...

vent lige mens jeg tjekker lidt mere :p
Avatar billede tuctoh Nybegynder
04. august 2003 - 17:59 #5
ok, nu har jeg fået den del ordnet...

Står nu med et lidt andet problem, som du måske selv har haft, og kan hjælpe med!?

Den funktion som jeg viste oven over ender med at lave en INSERT.
Det underlige er nu, hvis jeg kører SP'en fra Query Analyzer, inserter den og det hele PERFEKT som den skal. Men hvis jeg kalder samme funktion fra en ASP side, laver den ikke det INSERT!? Der kommer ingen fejl eller noget.
Jeg bruger samme bruger i QA som på ASP siden.


Kan du sige mig hvad det kan skyldes? Jeg har i toppen af siden sat "set nocount on", så det burde ikke være grunden.

Håber du kan hjælpe mig. Har siddet hele dagen med denne her simple funktion, uden at det er klaret endnu :(
Avatar billede mjohansen Nybegynder
05. august 2003 - 10:10 #6
Hmmm. Er du HELT sikker på det er samme bruger? Kig evt. i enterprise manager og check bruger og databasenavn.
Avatar billede tuctoh Nybegynder
05. august 2003 - 10:26 #7
ja, er samme bruger... Er måske nærmere en form for driver-problem.
Jeg har dog oprettet spørgsmålet her:
http://exp.dk/spm/383725

Hvad siger du til at vi deler de h er 60 points? Fejlen blev ikke rettet ved dit svar, men du brugte dog tid på det :p
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