Avatar billede peterfup Nybegynder
07. november 2003 - 12:08 Der er 8 kommentarer og
1 løsning

Kald af stored procedure flere gange

Hejza...

Jeg har følgende kode:

CREATE PROCEDURE deleteCategory @categoryId int
AS
EXEC deleteDocument SELECT document FROM documentList WHERE category = @categoryId
DELETE FROM category WHERE id = @categoryId
GO

som jo ikk virker!
Jeg vil kalde deleteDocument for hver document fundet i tabellen documentList.

Hvordan skal denne stored procedure sammensættes?

/PeterFup
Avatar billede ldanielsen Nybegynder
07. november 2003 - 12:16 #1
CREATE PROCEDURE deleteCategory @categoryId int
AS


DELETE FROM category WHERE id IN
(SELECT document FROM documentList WHERE category = @categoryId)

GO
Avatar billede ldanielsen Nybegynder
07. november 2003 - 12:18 #2
Skulle jeg mene, PAS PÅ MED DELETES

Er det korrekt at category.id skal være lig med documentList.document??

Det var ligesom det du antydede.
Avatar billede peterfup Nybegynder
07. november 2003 - 12:24 #3
Nej... For lige at skitsere tabellerne:

category:
id
name

documentList:
category
document

document:
id
name

Tabellen documentList knytter tabellerne document og category sammen.
Når jeg sletter en category vil der være x antal indgange i documentList knyttet til denne og i disse skal jeg kalde en anden stored procedure (deleteDocument) med parameteret document.
Avatar billede peterfup Nybegynder
07. november 2003 - 12:26 #4
Dvs. at hvis der er 5 tupler med det medsendte categoryId, så skal deleteDocument kaldes 5 gange med hvert af id'erne (document) fundet i documentList.
Avatar billede peterfup Nybegynder
07. november 2003 - 12:31 #5
Tilsidst skal jeg så selvfølgelig slette indgangen i category.

Problemet ligger i linien:
EXEC deleteDocument SELECT document FROM documentList WHERE category = @categoryId

SELECT returnerer måske 5 documentid'er, men jeg får at vide at proceduren ikke får nogen parametre med. Den skal udføres 5 gange i det her tilfælde.
Avatar billede bleze Nybegynder
07. november 2003 - 16:47 #6
Hvis du virkeligt vil kalde storedproc 5 gange, så skal du bruge en CURSOR...

declare @document int
declare cursor #mincursor for

SELECT document FROM documentList WHERE category = @categoryId

open #mincursor
fetch into @document
while @@fetch_status <> -1
begin
  exec deletedoc @document
  fetch into document
end

close #mincursor
deallocate #mincursor


Kan ikke helt huske syntax, men det kan du slå op i Books Online hvor du har installeret MSSQL
Avatar billede peterfup Nybegynder
07. november 2003 - 17:10 #7
JA TAK...

Det var lige hvad som skulle til...

Her er det færdige resultat - syntaxen var næsten rigtig:

CREATE PROCEDURE deleteCategory @categoryId int
AS
DECLARE @document int
DECLARE #myCursor cursor FOR SELECT document FROM documentList WHERE category = @categoryId

OPEN #myCursor
FETCH NEXT FROM #myCursor INTO @document
WHILE @@fetch_status = 0
BEGIN
  EXEC deleteDocument @document
  FETCH NEXT FROM #myCursor INTO @document
END

CLOSE #myCursor
DEALLOCATE #myCursor
DELETE FROM category WHERE id = @categoryId
GO

Jeg siger mange tak for hjælpen og pointene går til bleze... og go weekend!

/PeterFup
Avatar billede bleze Nybegynder
07. november 2003 - 22:49 #8
Jeg takker, hvis jeg havde haft en SQL server herhjemme havde syntax self været perfekt. Men godt du fik idéen til at lave det færdigt selv :)
Avatar billede peterfup Nybegynder
09. november 2003 - 14:26 #9
Bare man lige får et skub i den rigtige retning, så er det jo bare et spørgsmål om at fedte det til...
Har aldrig brugt cursor før, så det havde nok taget mig et stykke tid før jeg var faldet over den... :-)
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