14. juni 2001 - 15:22Der er
7 kommentarer og 1 løsning
While loop stopper ved brug af cursor...hvorfor
sagen er den at der skal slettes i forskellige tabeller, men da disse relatere til hinanden skal det gøres i korrekt rækkefølge. fremmednøgler først og primær efter. Men uanset hvad jeg gør så stopper while løkken efter 1 omgang. cursorens fetch status bliver sat til -1, men der er flere rækker i cursoren. hvorfor??????
CREATE PROCEDURE EC_DeleteEvent ( @eventID int )
AS
DECLARE @participantID VARCHAR(10), @hotel VARCHAR(10), @flight VARCHAR(10), @counter int
BEGIN
SELECT @counter = 0;
DECLARE participant CURSOR FOR SELECT participantID FROM EC_event_participant WHERE eventID = @eventID;
OPEN participant
FETCH NEXT FROM participant INTO @participantID; WHILE (@@FETCH_STATUS <> -1) BEGIN
IF @counter < 1 BEGIN DELETE FROM EC_event_participant WHERE eventID = @eventID;
END;
SELECT @counter + 1
SELECT @hotel = hotelID, @flight = flightID FROM EC_participant WHERE participantID = @participantID;
DELETE FROM EC_participant WHERE participantID = @participantID;
IF @hotel IS NOT NULL BEGIN DELETE FROM EC_hotel WHERE hotelID = @hotel; END;
IF @flight IS NOT NULL BEGIN DELETE FROM EC_flight WHERE flightID = @flight; END;
FETCH NEXT FROM participant INTO @participantID; END;
CLOSE participant; DEALLOCATE participant;
DELETE FROM EC_event_employee WHERE eventID = @eventID; DELETE FROM EC_event WHERE eventID = @eventID;
prøv lige at studere dette fra sql BOL - kunne det ikke have betydning!:
When a cursor is opened, the current row position in the cursor is logically before the first row. This causes the different fetch options to have the following behaviors if they are the first fetch performed after the cursor is opened:
FETCH FIRST Fetches the first row in the cursor.
FETCH NEXT Fetches the first row in the cursor.
FETCH PRIOR Does not fetch a row.
FETCH LAST Fetches the last row in the cursor.
FETCH ABSOLUTE n Fetches the nth row from the first row in the cursor if n is a positive integer. If n is a negative integer, then the row n rows before the end of the cursor is fetched (for example, n = -1 returns the last row in the cursor). If n is 0, no rows are fetched.
FETCH RELATIVE n Fetches the nth row in the cursor if n is positive. No rows are fetched if n is negative or 0.
OK, jeg tror jeg har et forslag, se bemærkningerne:
--Her henter du participantID DECLARE participant CURSOR FOR SELECT participantID FROM EC_event_participant WHERE eventID = @eventID;
OPEN participant
FETCH NEXT FROM participant INTO @participantID; WHILE (@@FETCH_STATUS <> -1) BEGIN
IF @counter < 1 BEGIN --Her sletter du alle Participants, derfor vil du få -1 på næste fetch, der er nemlig ikke flere tilbage i tabellen. DELETE FROM EC_event_participant WHERE eventID = @eventID;
END;
I stedet for skal du nok hente alle participantID op i #temp tabel, og så bruge den i stedet, så mister du ikke ID\'erne under vejs.
Hvorfor anvende en cursor?? De performer ikke særligt godt og kan være ret indviklede at arbejde med. Det skulle da være nok med almindelige DELETE statements - f.eks. for at slette fra tabellen EC_hotel:
DELETE EC_hotel FROM EC_hotel INNER JOIN EC_participant ON EC_hotel.hotelID = EC_participant.hotelID INNER JOIN EC_event_participant ON EC_participant.participantID = EC_event_participant.participantID WHERE EC_event_participant.eventID = @eventID
Sorry, hvis der skulle være slå-fejl i SQL\'en - et textarea-felt er ikke vildt velegnet som SQL-editor ;o) På samme måde skulle der også kunne slettes fra de øvrige undertabeller, og så er der bare primær tabellerne tilbage.
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.