[SQL srv 2000] SP met cursors en while

Pagina: 1
Acties:

  • Y3PP3R
  • Registratie: Oktober 2002
  • Laatst online: 07-02 17:11
Ik heb een table met verschillende magazijns en modellen. Telkens als er wat in of uit een magazijn gaat wordt dat in de tabel als een record toegevoegd. als er iets binnenkomt, dan is binnen een datum en is uit NULL en als er iets uit gaat andersom. Alle modellen hebben ook nog een kleurnummer en een combinatienummer.

Nu is het mogelijk dat het zelfde model verschillende keren is binnen gekomen op 1 plaats en ook wel er uit is gegaan.

Het is de bedoeling dat ik weergeef hoeveel van de verschillende modellen op dit moment aanwezig zijn in welk magazijn.

Daarvoor heb ik een SP gemaakt, die een tablevariable maakt met van alle verschillende modellen per magazijn het totaal. Hij werkt met verschillende cursors die ik genest heb (misschien dat hier t probleem zit?).

Het probleem is namelijk dat mn tablevariable leeg blijft. In t executionplan heb ik gezien, dat alleen de eerste cursor rows returned, dus, alle andere cursors worden doordat ik WHILE @@FETCH_STATUS = 0 gebruik, niet geopend en mn INSERT statement wordt niet bereikt.

Ik heb er eens over nagedacht, alleen ik zou geen alternatief SET-Based solution weten.

Kan iemand mij vertellen waar de fout in mijn code zit? Ik heb hem nagelopen, uitgevoerd en dingen nagezocht in de SQLsvr 2k bible en gezocht in t forum.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
DECLARE @magazijn NVARCHAR(50), @inkoopnr INT, @combi NCHAR, @kleurnr INT, @bekledingnr INT, @totaal INT

DECLARE cMagazijn CURSOR FOR SELECT DISTINCT magazijn FROM voorraad
DECLARE cModel CURSOR FOR SELECT DISTINCT inkoopnr FROM voorraad WHERE magazijn='@magazijn'
DECLARE cCombi CURSOR FOR SELECT DISTINCT modelnr FROM voorraad WHERE magazijn='@magazijn' AND inkoopnr=@inkoopnr
DECLARE cKleur CURSOR FOR SELECT DISTINCT kleurnr FROM voorraad WHERE magazijn='@magazijn' AND inkoopnr=@inkoopnr AND modelnr='@combi'
DECLARE cBekleding CURSOR FOR SELECT DISTINCT bekledingnr FROM voorraad WHERE magazijn='@magazijn' AND inkoopnr=@inkoopnr AND modelnr='@combi' AND kleurnr=@kleurnr

DECLARE @voorraad TABLE (
[ID] INT NOT NULL PRIMARY KEY IDENTITY(1,1),  
Magazijn NVARCHAR(50),
Inkoopnr INT,
Model NCHAR,
Bekledingnr INT,
Kleurnr INT,
Aantal INT)

OPEN cMagazijn

FETCH cMagazijn INTO @magazijn
WHILE @@Fetch_Status = 0
    BEGIN
        OPEN cModel
        FETCH cModel INTO @inkoopnr
        WHILE @@Fetch_Status = 0
        BEGIN
            OPEN cCombi
            FETCH cCombi INTO @combi
            WHILE @@Fetch_Status = 0
            BEGIN
                OPEN cKleur
                FETCH cKleur INTO @kleurnr
                WHILE @@Fetch_Status = 0
                BEGIN
                    OPEN cBekleding
                    FETCH cBekleding INTO @bekledingnr
                    WHILE @@Fetch_Status = 0
                    BEGIN
                        SELECT @totaal = SUM(aantal) FROM voorraad WHERE magazijn=@magazijn AND inkoopnr=@inkoopnr AND modelnr=@combi AND kleurnr=@kleurnr AND bekledingnr=@bekledingnr AND binnen IS NOT NULL
                        SELECT @totaal = @totaal - SUM(aantal) FROM voorraad WHERE magazijn=@magazijn AND inkoopnr=@inkoopnr AND modelnr=@combi AND kleurnr=@kleurnr AND bekledingnr=@bekledingnr AND uit IS NOT NULL
                        INSERT INTO @voorraad(magazijn, inkoopnr, Model, bekledingnr, kleurnr, aantal) VALUES(@magazijn, @inkoopnr, @combi, @bekledingnr, @kleurnr, @totaal)
                        FETCH cBekleding INTO @bekledingnr
                    END
                    CLOSE cBekleding
                    FETCH cKleur INTO @kleurnr
                END
                CLOSE cKleur
                FETCH cCombi INTO @combi
            END
            CLOSE cCombi
            FETCH cModel INTO @inkoopnr
        END
        CLOSE cModel
        FETCH cMagazijn INTO @magazijn
    END
CLOSE cMagazijn

DEALLOCATE cMagazijn
DEALLOCATE cKleur
DEALLOCATE cCombi
DEALLOCATE cBekleding
DEALLOCATE cModel

SELECT * FROM @voorraad

  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

Bij het doorgeven van een string variabele, "...magazijn='@magazijn'... ", in de query is het niet de bedoeling dat je deze omsluit met enkele quotes. Maar daar zit het probleem niet, het eerst declareren van de cursors zal afaik sowieso niet werken. Deze zal je telkens weer opnieuw moeten opbouwen binnen je lus(sen).

Maar ik raad je aan om nog eens goed te kijken naar je gekozen oplossingsroute. Het gebruik van 1 cursor is voor de meeste database professionals al een reden om zich even achter de oren te krabben en te kijken of dit wel de enige en juiste methode is, laat staan wanneer je er 5 hebt.

Today's subliminal thought is:


  • Y3PP3R
  • Registratie: Oktober 2002
  • Laatst online: 07-02 17:11
Dank je :) die enkele quotes waren een probeersel, ik had m oorspronkelijk ook zonder.
Ik zal eerst proberen of jouw oplossing verder werkt, moet ik dan ook steeds deallocaten?

Ik heb ook eens nagedacht over een While lus met @@rowcount, alleen dan zou ik niet weten hoe ik ditzelfde gedaan moet krijgen. Ik wil niet makkelijk zijn, ik modder hier al de hele dag mee namelijk, maar kan iemand mij even op t juiste pad helpen zonder cursors?

  • EfBe
  • Registratie: Januari 2000
  • Niet online
IF @bNestedCursors THEN
BEGIN
USE GroupBy
END

m.a.w.: je moet naar een groupby query kijken, groeperen op de fields in je @voorraad table. Ik ga niet je gehele query langs maar nested cursors zijn altijd middels group by op te lossen.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • Y3PP3R
  • Registratie: Oktober 2002
  • Laatst online: 07-02 17:11
*voelt zich stom*
O o o wat is dat makkelijk met group by ...

Dank dank!!

  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 13:02
Heb je 't nu opgelost met of zonder cursors?
Ik heb nog niet helemaal door wat je wilt (lukt me niet om die 5 lussen in m'n hoofd te leggen) , maar volgens mij kan het zelfs zonder cursors.

Dus als je nog cursors gebruikt, kan je dan wat specifieker aangeven wat je wilt bereiken. Evt. met voorbeelddata.

  • EfBe
  • Registratie: Januari 2000
  • Niet online
Ik heb nog niet helemaal door wat je wilt (lukt me niet om die 5 lussen in m'n hoofd te leggen) , maar volgens mij kan het zelfs zonder cursors.
Hij heeft geprobeerd met cursors uit te leggen hoe GROUP BY werkt. :) :+

[ Voor 54% gewijzigd door EfBe op 28-12-2003 13:36 ]

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com

Pagina: 1