Fragensteller
Ausgabe des Ergebnisses einer StoredProcedure in Tabeelle

Allgemeine Diskussion
-
Meine sehr komplexe StoredProcedure [SP_count]
liefert genau einen Wert , eine Anzahl (Anz), wobei eine ID übergeben wird:
exec [SP_count] @ObjNo
So, jetzt will ich diese SP aber nicht einzeln für eine bestimmte ID aufrufen, sondern für eine ganze Liste von IDs, die man so erhält
Select ObjNo from Tabellexxx where [Bedingung]
OK, so würde es im Prinzip gehen:
go
Declare @ObjNo as integer;
DECLARE @Tab as table (Objectno integer, Anz int);
Create table #Tab (Objectno integer, Anz int);
Set @ObjNo = 1;
While @ObjNo < 100
begin
insert into #Tab( ObjectNo, Anz )
exec [SP_count] @ObjNo;
Update #Tab set Objectno = @ObjNo where Objectno is Null;
Set @ObjNo = @ObjNo + 1 ;
end;
select * from #Tab;
drop table #Tab;
goAber ich will ja statt von 1 bis xxx ja die IDs aus der obigen Abfrage einbauen. D.h. wie mancht man eine Schleife über die Abfrage?
- Typ geändert Ciprian Bogdan Dienstag, 11. März 2014 20:40 Keine Rückmeldung des Fragenstellender
Alle Antworten
-
Hall Klaus-Dieter,
bei dem Aufbau wäre das über einen Cursor zu regeln, siehe DECLARE CURSOR.
Create table #Tab (Objectno integer, Anz int); Declare @ObjNo as integer; DECLARE ObjectCursor CURSOR LOCAL FAST_FORWARD FOR SELECT Select ObjNo from Tabellexxx where [Bedingung]; OPEN ObjectCursor FETCH NEXT FROM ObjectCursor INTO @ObjNo; WHILE @@FETCH_STATUS = 0 BEGIN insert into #Tab( ObjectNo, Anz ) exec [SP_count] @ObjNo; Update #Tab set Objectno = @ObjNo where Objectno is Null; FETCH NEXT FROM ObjectCursor INTO @ObjNo; end; CLOSE ObjectCursor; DEALLOCATE ObjectCursor; select * from #Tab; drop table #Tab; go
Du solltest überlegen, ob Du Deiner Prozedur "sp_count" nicht besser mit einer Ausgabe-Variablen versiehst, die das Ergebnis direkt zurückgibt, denn die derzeitige Schleife ist nicht gerade ein Renner:CREATE PROCEDURE dbo.sp_count @objno int, -- Eingabe @count int OUTPUT -- Rückgabe AS -- ... SET @count = (SELECT ...) -- oder was auch immer
siehe CREATE PROCEDURE und Ausgabeparameter (OUT[PUT])
Im übrigen sollte man sp_ nur für Systemprozeduren verwenden, für Benutzerprozeduren wäre z. B. usp_ üblich.
Gruß Elmar
-
Hallo Klaus Dieter,
was macht deine SP? Kannst Du daraus eine SQL-Function machen?
Wenn ja hast Du dann die Option auf ein Cross Apply und einer einzigen SQL.
Siehe: http://www.sqlteam.com/article/using-cross-apply-in-sql-server-2005
Die Stored Procedure kriegst Du in einer SQL via Join nicht aufgerufen.
Grüße Alexander
-
Wenn Du SQL Server 2008 und höher bist, kann ich so auf den ersten Blick keinen Grund für einen CURSOR entdecken.
Eine Table-Valued Parameter sollte es doch auch tun, oder?
Beschrieben hier: http://msdn.microsoft.com/de-de/library/bb675163%28v=vs.110%29.aspx
Dann sollte man mit einem Set-basierten Update hinkommen (z.b. über eine Unterabfrage bzw. einen Join beim Update)
Ich hoffe ich habe hier nix übersehen, so verdächtig einfach wie das klingt.
Andreas Wolter | Microsoft Certified Master SQL Server
Blog: www.insidesql.org/blogs/andreaswolter
Web: www.andreas-wolter.com | www.SarpedonQualityLab.com -
@ Elmar
Ja, ich habe mir gleich gedacht, dass es mit einem Cursor gehen sollte, aber Cursor sind nicht wirklich meine Stärke. Ich hatte zunächst versucht ein ähnliches Beispiel anzupassen, aber es klappte nicht. Und ehe ich noch weitere Stunden reibnstecke habe ich hier lieber nachgefragt ;-)
OK, so hat es prima geklappt. Und der Cursorcode ist sogar so einfach, dass ich ihn auch verstehe ;-) Vielen Dank für die Hilfe.
Wegen der Perfomance brauchst du dir keine Sorgen zu machen: Es geht nur um eine einmalige Auswertung!
Und die Konvention, das man sp_ nur für Systemprozeduren verwenden sollte kannte ich nicht. Aber es hält sich hier im Haus eh keiner dran. Es gibt die phantsievollsten Benennungen
@ Alexander
Auch dir vielen Dank. Das mit der SQL-Function macht in diesem Fall sicher keinen Sinn, aber ich schaue mir das Beispiel dennoch an - man weiß ja nie.
Viele Grüße
Klaus-Dieter
-
Hallo Klaus-Dieter,
Geschwindigkeit alleine ist nicht alles ;)
Ein Ausgabeparameter würde die Prozedur allgemein leichter verwendbar machen. Wie mit den Cursorn solltest Du Dich mit dem Konzept vertraut machen, dann ist es halb so wild.
Gruß Elmar
-
*****************************************************************************************************
Dieser Thread wurde mangels weiterer Beteiligung des Fragestellenden ohne bestätigte Lösung abgeschlossen.
Neue Rückfragen oder Ergänzungen zu diesem Thread bleiben weiterhin möglich.
*****************************************************************************************************
Ciprian Bogdan, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip„Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.