none
mehrere Ergebnisse aus Stored Procedure RRS feed

  • Frage

  • Hallo,

    ich habe ein Problem mit StoredProcedures eines Produktes welches wir bei uns einsetzen.

    Die SP liefert vier Results die durch 4 selects in der SP erzeugt werden. Die ersten zwei Ergebnisse haben 6 Spalten, das 3 und 4 Ergebniss hat 8 Spalten.

    Alle vier Ergebnisse möchte ich in einer Tabelle abfüllen, dazu habe ich eine @table mit 8 Spalten erzeugt und gehofft, über

    execute as User = 'u...'
    insert into @table
    exec [dbname].[u1].[usp_...]
    revert

    alle vier Ergebnisse in eine Tabelle abfüllen zu können.

    Leider bekomme ich ein Fehler
    ==> Msg 817, Level 16, State 1 ...An INSERT EXEC statement cannot be nested.
    ==> Msg 213, Level 16, State 7 ...Column name or number of supplied values does not match table definition.

    Wie könnte ich alle Ergebnisse in eine Tabelle packen? Leider ist es nicht erlaubt die SP zu ändern... :-(

    Für Infos herzlichen Dank.

    Viele Grüsse,
    Maximilian

    Mittwoch, 23. November 2016 10:02

Antworten

  • Hallo Maximilian,

    Da INSERT EXEC die Metadaten des (ersten) Ergebnisses auswertet, kann es mit weiteren nichts anfangen.

    Sollte es keine Möglichkeit geben, z. B. durch geschickte Parameterkombination oder einen optionalen Parameter, die einzelnen Ergebnisse abzurufen, wäre die beste Option die Möglichkeiten des SQL Client zu nutzen.

    Dort kann man mit NextResult die einzelnen Ergebnisse abrufen. Und auch notwendige Konvertierungen vornehmen, so dass die Anzahl und Metadaten der Spalten konsistent sind, also zumindest implizit konvertierbar sind. Das könnte man als CLR Prozedur implementieren, so dass man es wiederum für INSERT EXEC nutzen könnte.

    Gruß Elmar

    @Olaf: MARS ist noch ein anderes Paar Schuhe, dabei geht es um mehrere parallele Ergebnisse auf einer Verbindung. Hier kommen die Ergebnisse nacheinander, wenn auch mit unterschiedlichem Aufbau, das ging immer schon - wenn auch nicht gerade "best practice".

    Mittwoch, 23. November 2016 11:35
    Beantworter
  • Hallo Maximilian,

    hier noch ein etwas anderer Ansatz:
    - Nimm Dir die Stored Procedure als Vorlage.
    - Erstelle eine eigene Prozedur (in dieser Datenbank oder einer anderen), die bereits die INSERT Statements enthält.
    - Führe Deine neue Prozedur aus.

    Nachteil wie auch bei den anderen Vorschlägen: Du musst die Verarbeitung anpassen, wenn sich an der originalen Prozedur etwas ändert.


    Einen schönen Tag noch, Christoph -- Data Platform MVP - http://www.insidesql.org/blogs/cmu

    Mittwoch, 23. November 2016 11:50

Alle Antworten

  • Hallo Maximilian,

    wenn eine Stored Procedure mehrere Ergebnissätze liefert, geht das in Richtung MARS (Multiple Active Result Sets) und rein T-SQL kann mit dem Ergebnis nichts anfangen, das kann nur Applikations-seitig weiter verarbeiten.

    Alternativ nimm den Source Code der SP und führe die Select Abfragen einzeln nacheinander aus.


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Mittwoch, 23. November 2016 11:27
  • Hallo Maximilian,

    Da INSERT EXEC die Metadaten des (ersten) Ergebnisses auswertet, kann es mit weiteren nichts anfangen.

    Sollte es keine Möglichkeit geben, z. B. durch geschickte Parameterkombination oder einen optionalen Parameter, die einzelnen Ergebnisse abzurufen, wäre die beste Option die Möglichkeiten des SQL Client zu nutzen.

    Dort kann man mit NextResult die einzelnen Ergebnisse abrufen. Und auch notwendige Konvertierungen vornehmen, so dass die Anzahl und Metadaten der Spalten konsistent sind, also zumindest implizit konvertierbar sind. Das könnte man als CLR Prozedur implementieren, so dass man es wiederum für INSERT EXEC nutzen könnte.

    Gruß Elmar

    @Olaf: MARS ist noch ein anderes Paar Schuhe, dabei geht es um mehrere parallele Ergebnisse auf einer Verbindung. Hier kommen die Ergebnisse nacheinander, wenn auch mit unterschiedlichem Aufbau, das ging immer schon - wenn auch nicht gerade "best practice".

    Mittwoch, 23. November 2016 11:35
    Beantworter
  • Hallo Maximilian,

    hier noch ein etwas anderer Ansatz:
    - Nimm Dir die Stored Procedure als Vorlage.
    - Erstelle eine eigene Prozedur (in dieser Datenbank oder einer anderen), die bereits die INSERT Statements enthält.
    - Führe Deine neue Prozedur aus.

    Nachteil wie auch bei den anderen Vorschlägen: Du musst die Verarbeitung anpassen, wenn sich an der originalen Prozedur etwas ändert.


    Einen schönen Tag noch, Christoph -- Data Platform MVP - http://www.insidesql.org/blogs/cmu

    Mittwoch, 23. November 2016 11:50
  • Hallo zusammen,

    erst mal vielen Dank für die Antworten, ich denke ich werde die originale SP zerlegen und nachbilden, das anlegen von eigenen SP's möchte ich vermeiden damit die DB nichts beinhaltet was nicht vom Program-Developer vorgesehen war.

    Wird mühsam bei jedem Support-Case zu erklären das ein aufgetretener Fehler sicher nichts mit einer eigenen SP zu tun hat :-)

    Viele Grüsse,
    Maximilian

    Freitag, 2. Dezember 2016 08:06
  • Hallo Maximilian,

    Du kannst die Prozedur ja auch in einer eigenen Datenbank erstellen und alle Objekte voll qualifiziert verwenden. Die Ergebnisse legst Du dann in der eigenen Datenbank ab.

    Wenn Deine Fragen beantworten sind, markiere doch noch die für Dich relevanten Antworten.


    Einen schönen Tag noch, Christoph -- Data Platform MVP - http://www.insidesql.org/blogs/cmu

    Freitag, 2. Dezember 2016 08:10