2014-03-24 27 views
22

ich eine temporäre Tabelle erklärt haben, alle erforderlichen Werte zu halten, wie folgt:Schleife durch alle Zeilen einer temporären Tabelle für jede Zeile eine gespeicherte Prozedur und rufen

DECLARE @temp TABLE 
    (
    Password int, 
    IdTran int, 
    Kind varchar(16) 
    ) 

INSERT INTO @temp 
SELECT s.Password, s.IdTran, 'test' 
from signal s inner join vefify v 
    on s.Password = v.Password 
and s.IdTran = v.IdTran 
and v.type = 'DEV' 
where s.[Type] = 'start' 
AND NOT EXISTS (SELECT * FROM signal s2 
      WHERE s.Password = s2.Password 
      and s.IdTran = s2.IdTran 
      and s2.[Type] = 'progress') 

INSERT INTO @temp 
SELECT s.Password, s.IdTran, 'test' 
from signal s inner join vefify v 
    on s.Password = v.Password 
and s.IdTran = v.IdTran 
and v.type = 'PROD' 
where s.[Type] = 'progress' 
AND NOT EXISTS (SELECT * FROM signal s2 
      WHERE s.Password = s2.Password 
      and s.IdTran = s2.IdTran 
      and s2.[Type] = 'finish') 

Jetzt muss ich die Zeilen in einer Schleife durch in der @ temp-Tabelle und für jede Zeile einen sp aufrufen, der alle Parameter der @ temp-Tabelle als Eingabe akzeptiert. Wie kann ich das erreichen?

+0

Liefert Ihr Prozess mehrere oder einzelne Zeilen für jeden Wert in der @temp-Tabelle. Wenn proc nur eine einzelne Zeile/Wert zurückgibt, würde ich dies in die Aufruffunktion umschreiben. Auf diese Weise können Sie für jeden Wert in der Tabelle ohne 'cursors' =' CURSES' oder 'LOOPS' ausführen. SQL soll satzbasierte Verarbeitung, nicht Schleifen, durchführen. Die meisten Leute in der Gemeinschaft werden alles vermeiden, was mit 'cursors' zu tun ist, es ist wirklich ein' Fluch' –

Antwort

63

könnten Sie einen Cursor verwenden:

DECLARE @id int 
DECLARE @pass varchar(100) 

DECLARE cur CURSOR FOR SELECT Id, Password FROM @temp 
OPEN cur 

FETCH NEXT FROM cur INTO @id, @pass 

WHILE @@FETCH_STATUS = 0 BEGIN 
    EXEC mysp @id, @pass ... -- call your sp here 
    FETCH NEXT FROM cur INTO @id, @pass 
END 

CLOSE cur  
DEALLOCATE cur 
+0

Wie gebe ich das Passwort, IdTran, Kind vom @temp in den gespeicherten proc ein? – merazuu

+0

siehe bearbeiten, Passwort hinzugefügt Sie den Rest :) –

+0

Awesome funktioniert super! Ich bin neugierig, ob es eine Möglichkeit gibt, dies ohne den Cursor zu verwenden? Wäre es effizienter ohne den Cursor (Dies wird für Hunderttausende von Datensätzen ausgeführt werden)? – merazuu

1

Versuchen Sie den Datensatz aus der gespeicherten Prozedur auf Ihre Datentabelle in C# oder VB.Net zurück. Dann kann die große Menge an Daten in Ihrer Datentabelle mit einer Massenkopie in Ihre Zieltabelle kopiert werden. Ich habe BulkCopy verwendet, um große Databases mit Tausenden von Zeilen in Sql-Tabellen mit großem Erfolg in Bezug auf die Leistung zu laden.

Sie können mit BulkCopy in Ihrem C# - oder VB.Net-Code experimentieren.

1

so etwas wie das?

DECLARE maxval, val, @ind INT; 
SELECT MAX(ID) as maxval FROM table; 

while (ind <= maxval ) DO   

     select `value` as val from `table` where `ID`=ind; 

     CALL fn(val); 

     SET ind = ind+1; 
end while; 
0

Sie benötigen dafür immer keinen Cursor. Sie können es mit einer while-Schleife machen. Sie sollten Cursor möglichst vermeiden. While-Schleife ist schneller als Cursor.

+0

Wovon redest du, Kumpel? –

+0

Wonach fragst du meinen Freund? Du denkst du brauchst immer einen Cursor? – Sam

+2

Ich sage nicht, dass Ihre Behauptungen falsch sind. Ich sage, du hast eine schlechte Antwort gegeben. Sie erklären nichts oder geben Hinweise darauf, wo Sie weitere Informationen finden können. Ihre Antwort hilft in keiner Weise. –

Verwandte Themen