none
Ausgabe des Ergebnisses einer StoredProcedure in Tabeelle RRS feed

  • 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;
    go

    Aber 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
    Dienstag, 12. November 2013 12:05

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

    Dienstag, 12. November 2013 12:29
  • 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

    Dienstag, 12. November 2013 12:31
  • 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

    Dienstag, 12. November 2013 14:11
  • @ 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

    Dienstag, 12. November 2013 14:20
  • Hallo Andreas,

    solange die Stored Procedure (sp_count) als gegeben angesehen muss, wird es wohl nichts mit dem aetbasierten Update ;)

    Gruß Elmar

    Mittwoch, 13. November 2013 07:04
  • 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

    Mittwoch, 13. November 2013 07:06
  • *****************************************************************************************************

    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-PrinzipEntwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.





    Dienstag, 11. März 2014 20:40