gespeicherte prozedur "loopen"

Diskutiere gespeicherte prozedur "loopen" im Developer Network Forum im Bereich Hardware & Software Forum; wie kann man die ausführung einer gespeicherten prozedur "loopen", also mehrfach hintereinander mit unterschiedlichen werten ausführen in einer...
  • gespeicherte prozedur "loopen" Beitrag #1
haiko

haiko

Bekanntes Mitglied
Dabei seit
09.01.2003
Beiträge
4.727
Reaktionspunkte
1
Ort
Kempten
wie kann man die ausführung einer gespeicherten prozedur "loopen", also mehrfach hintereinander mit unterschiedlichen werten ausführen in einer sql-anweisung?

zur erklärung:
ich habe eine gespeicherte prozedur, die irgdnewelche daten ändert. die prozedur braucht als parameter eine id. der aufruf ist also in etwa so "exec gespeicherte_prozedur id". das funktioniert auch problemlos.

das problem ist jetzt, daß ich mehrere ids habe, bei denen ich die prozedur ausführen will. diese ids kommen von einer einfachen sql-abfrage: "select id from tabelle where irgendwas=true".

wie schaffe ich es jetzt im sql, die gespeicherte prozedur für jede id aus dem select aufzurufen?


exec gespeicherte_prozedur loop(select id from tabelle where irgendwas=true) funktioniert leider nicht.

bei php würd ich das mit "while (($row = mssql_fetch_array($result, MSSQL_BOTH))) ...." machen. leider gibts sowas ja leider nicht im sql.
 
  • gespeicherte prozedur "loopen" Beitrag #2
C

COGE

Bekanntes Mitglied
Dabei seit
13.01.1999
Beiträge
6.151
Reaktionspunkte
3
Ort
hinten wie von vorne
worin wird die prozedur ausgeführt?
wenn das komplett im sql stattfinden soll, würde ich eine Funktion schreiben und das ergebnis aus der 'select id from ...'-Abfrage mit Hilfe eines Cursors durchgehen und als Parameter in die Procedure schicken
 
  • gespeicherte prozedur "loopen" Beitrag #3
O

O Love

Bekanntes Mitglied
Dabei seit
08.04.1999
Beiträge
2.286
Reaktionspunkte
0
Die bessere Variante ist die von CODE geschilderte, falls Deine StoredProc nur einen Rückgabeparameter hat. Trifft dies nicht zu, dann schaue Dir folgenden Beispielcode an:
Code:
declare @ID int, @MaxID int
declare @LoopTable table (ID int identity primary key, ...)

insert into @LoopTable (...)
select ...
from SourceTable

select @ID = 1, @MaxID = count (*) from @LoopTable
while @ID <= @MaxID begin
  select @Param1 = ..., @Param2 = ... from @LoopTable where ID = @ID
  exec StoredProc @Param1, @Param2
  set @ID = @ID + 1
end
Wichtig ist, daß Du einen Primärschlüssel in der Schleifen-Tabelle hast, denn darüber mußt Du iterieren. Hier im Beispiel sei dies ein AutoInc, es funktioniert aber auch ein ganz normaler Schlüssel. Dann mußt Du das so umschreiben:
Code:
set @Idx = (select min (ID_column) from @LoopTable)
while @Idx is not NULL begin
  select @Param1 = ..., @Param2 = ... from @LoopTable where ID_column = @Idx
  exec StoredProc @Param1, @Param2
  set @Idx = (select top 1 ID_column from @LoopTable where ID_column > @Idx order by ID_column)
end
Hierbei ist wichtig, daß Du die set-Anweisung mit einem select kombinierst, damit auch NULL zurückgeliefert wird, falls keine Daten mehr vorhanden sind. Weist Du das nämlich nur in einem select alleine zu, wird dies nicht ausgeführt, wenn nichts mehr kommt.
 
Zuletzt bearbeitet:
  • gespeicherte prozedur "loopen" Beitrag #4
haiko

haiko

Bekanntes Mitglied
Dabei seit
09.01.2003
Beiträge
4.727
Reaktionspunkte
1
Ort
Kempten
super, hat wunderbar funktioniert. hab jetzt das ganze jetzt mit der temporären table gemacht, das scheint mir leichter zu sein, als mit cursor. kann aber auch sein, daß ich das nicht ganz verstanden hab, die seiten, die ich mir dazu anageguckt hab, waren nicht so der hammer :)
 
Thema:

gespeicherte prozedur "loopen"

ANGEBOTE & SPONSOREN

https://www.mofapower.de/

Statistik des Forums

Themen
213.179
Beiträge
1.579.172
Mitglieder
55.878
Neuestes Mitglied
Satan666
Oben