INSERT INTO mit exec mit mehreren Resultsets

8

SQL Server ermöglicht es mir, die zurückgegebene Ergebnismenge einer gespeicherten Prozedur wie folgt einzufügen:

%Vor%

Dies funktioniert, solange die gespeicherte Prozedur nur 1 Ergebnismenge zurückgibt.

Gibt es eine Möglichkeit, dies zu tun, wenn die gespeicherte Prozedur mehrere Ergebnismengen zurückgibt?

z. B.

%Vor%     
Brad 04.11.2013, 15:32
quelle

5 Antworten

1

Ich hatte eine ähnliche Anforderung und verwendete schließlich eine CLR-Funktion, die Sie hier lesen können (dies ist die Antwort mit der Methode InsertResultSetsToTables , von Benutzer Dan Guzman):

Ссылка

Sie müssen ein SQL Server CLR-Projekt in Visual Studio erstellen, um loszulegen. Ich hatte ein Projekt, das bereits von einem Kollegen geschrieben wurde und das ich einfach erweitern könnte. Wenn Sie jedoch bei Null anfangen, lesen Sie bitte folgende Anleitung:

Ссылка

Wenn Sie das CLR-Projekt in der Datenbank geschrieben und veröffentlicht haben, ist hier ein Beispiel für die Verwendung des CLR-Projekts:

%Vor%     
Alexander 31.07.2017 12:23
quelle
1

Nein. Es gibt jedoch mehr Arbeit, da Sie keine Einfügung mit einer Prozedur durchführen können, die mehrere Ergebnisse mit einer anderen Anzahl von Spalten zurückgibt.

Wenn Sie die gespeicherte Prozedur ändern dürfen, können Sie temporäre Tabellen außerhalb der Prozedur deklarieren und sie in der gespeicherten Prozedur auffüllen. Dann können Sie mit ihnen außerhalb der gespeicherten Prozedur machen, was Sie brauchen.

  

CREATE TABLE # result1 (Jede Spalte gefolgt vom Datentyp des ersten Ergebnisses.);

     

---- Beispiel: CREATE TABLE # Ergebnis1 (Spalte1 int, Spalte2 varchar (10))

     

CREATE TABLE # result2 (Jede Spalte gefolgt vom Datentyp des zweiten Ergebnisses.);

     

EXEC pVendorBalance;

     

SELECT * FROM # Ergebnis1;

     

SELECT * FROM # Ergebnis2;

    
Kevin 25.01.2018 17:50
quelle
0

Tatsächlich gespeicherte Prozeduren können mehrere Ergebnismengen oder keine Ergebnismengen zurückgeben, das ist ziemlich willkürlich. Aus diesem Grund weiß ich keine Möglichkeit, diese Ergebnisse von anderem SQL-Code zu navigieren, der eine gespeicherte Prozedur aufruft.

Sie können jedoch die zurückgegebene Ergebnismenge aus einer tabellenwertigen benutzerdefinierten Funktion verwenden. Es ist wie eine normale UDF, aber anstatt einen Skalarwert zurückzugeben, geben Sie ein Abfrageergebnis zurück. Dann können Sie diese UDF wie jede andere Tabelle verwenden.

%Vor%

Ссылка

    
Mike Mooney 04.11.2013 15:38
quelle
0

Wenn die beiden Ergebnismengen die gleiche Anzahl von Spalten haben, dann

%Vor%

fügt die Vereinigung beider Datensätze in @ T1 ein.

Wenn nicht

Bearbeiten Sie dann dbo.pVendorBalance und fügen Sie Ergebnisse in temporäre Tabellen ein und wählen Sie in externen gespeicherten Prozeduren aus diesen temporären Tabellen.

Ein anderer Weg (wenn Sie es brauchen), können Sie versuchen

%Vor%

es wird den ersten Datensatz aufnehmen.

    
Lali 13.03.2014 06:47
quelle
0

Eine Abhilfe für dieses Problem wird mit OUTPUT Parameter (JSON / XML) anstelle von Resultsets.

%Vor%

Version mit OUT-Parametern:

%Vor%

Und letzter Aufruf:

%Vor%

DBFiddle Demo

BEARBEITEN:

Zweiter Ansatz ist die Verwendung tSQLt.ResultSetFilter CLR-Funktion (Teil tSQLt Test-Framework):

  

Das ResultSetFilter Verfahren bietet die Möglichkeit, ein einzelnes Ergebnis aus einer Anweisung gesetzt abzurufen, die Sätze mehrere Ergebnis führt.

%Vor%
    
lad2025 07.03.2018 20:23
quelle