Der Zugriff auf Ergebnismengen aus gespeicherten Prozeduren Transact-SQL SQL Server

StackOverflow https://stackoverflow.com/questions/58940

  •  09-06-2019
  •  | 
  •  

Frage

Ich bin mit SQL Server 2005, und ich würde gerne wissen, wie unterschiedliche Ergebnismengen zugreifen aus Transact-SQL. Die folgende gespeicherte Prozedur gibt zwei Ergebnismengen, wie ich auf sie aus, zum Beispiel, eine andere gespeicherte Prozedur?

CREATE PROCEDURE getOrder (@orderId as numeric) AS
BEGIN   
    select order_address, order_number from order_table where order_id = @orderId
    select item, number_of_items, cost from order_line where order_id = @orderId
END

Ich muss in der Lage, sowohl Ergebnis durchlaufen einzeln setzt.

EDIT: Nur um die Frage zu klären, ich die gespeicherten Prozeduren zu testen. Ich habe eine Reihe von gespeicherten Prozeduren, die von einem VB.NET-Client verwendet werden, die mehrere Ergebnismengen zurück. Diese gehen nicht auf eine Tabellenwertfunktion geändert werden, kann ich nicht in der Tat auf alle Verfahren ändern. das Verfahren zu ändern, ist keine Option.

Die Ergebnismengen durch die Verfahren zurück sind nicht die gleichen Datentypen oder die Anzahl der Spalten.

War es hilfreich?

Lösung

Die kurze Antwort ist: Sie kann es nicht

.

Von T-SQL gibt es keine Möglichkeit mehrere Ergebnisse eines verschachtelten Aufruf der gespeicherten Prozedur zugreifen zu können, ohne die gespeicherte Prozedur zu ändern, wie andere vorgeschlagen haben.

Um vollständig zu sein, wenn das Verfahren ein einzelnes Ergebnis zurückkehrten, können Sie es in eine temporären Tabelle oder Tabellenvariable mit folgenden Syntax einfügen könnten:

INSERT INTO #Table (...columns...)
EXEC MySproc ...parameters...

Sie können die gleiche Syntax für eine Prozedur, die mehrere Ergebnisse zurückgibt, aber es wird nur das erste Ergebnis verarbeiten, der Rest wird verworfen werden.

Andere Tipps

Ich war leicht in der Lage, dies zu tun, indem Sie eine SQL2005 CLR gespeicherte Prozedur zu schaffen, die ein internes Datum-Set enthalten ist.

Sie sehen, wird ein neues SqlDataAdapter .Fill ein Multiple-Ergebnis-Satz sproc in ein Multi-Table-Datensatz standardmäßig. Die Daten in diesen Tabellen können wiederum in #temp Tabellen in der Berufung sproc Sie schreiben möchten eingefügt werden. dataset.ReadXmlSchema zeigen Ihnen das Schema jeden Satz zur Folge hat.

Schritt 1: Starten Sie die gespeicherten Prozeduren zu schreiben, die die Daten aus der Multi-Ergebnismenge sproc lesen

a. Erstellen Sie eine separate Tabelle für jedes Ergebnis entsprechend dem Schema.

CREATE PROCEDURE [dbo].[usp_SF_Read] AS
SET NOCOUNT ON;
CREATE TABLE #Table01 (Document_ID VARCHAR(100)
  , Document_status_definition_uid INT
  , Document_status_Code VARCHAR(100) 
  , Attachment_count INT
  , PRIMARY KEY (Document_ID));

b. An dieser Stelle können Sie benötigen einen Cursor deklarieren wiederholt die CLR sproc rufen Sie hier schaffen:

Schritt 2: Stellen Sie die CLR Sproc

Partial Public Class StoredProcedures
    <Microsoft.SqlServer.Server.SqlProcedure()> _
    Public Shared Sub usp_SF_ReadSFIntoTables()

    End Sub
End Class

a. Schließen Sie New SqlConnection("context connection=true") verwenden.

b. Stellen Sie einen Befehlsobjekt (cmd), um die Mehrfachergebnismenge sproc enthalten.

c. Holen Sie sich alle Daten mit dem folgenden:

    Dim dataset As DataSet = New DataSet
    With New SqlDataAdapter(cmd)
        .Fill(dataset) ' get all the data.
    End With
'you can use dataset.ReadXmlSchema at this point...

d. Iterieren jede Tabelle und legt jede Zeile in die entsprechenden temporären Tabelle (die man oben in Schritt erstellt).

Abschließender Hinweis: Nach meiner Erfahrung, möchten Sie vielleicht einige Beziehungen zwischen Ihren Tabellen erzwingen, damit Sie wissen, welche Charge jeder Datensatz kam.

Das ist alles, was es ist!

~ Shaun, nahe Seattle

Es gibt eine Flickschusterei, die Sie auch tun können. Fügen Sie einen optionalen Parameter N int zu Ihrem sproc. Standard den Wert von N auf -1. Wenn der Wert von N-1 ist, dann tun Sie jede Ihrer wählt. Ansonsten tut der N-te auswählen und nur der N-te auswählen.

Beispiel:

if (N = -1 or N = 0)
    select ...

if (N = -1 or N = 1)
    select ...

Die Anrufer Ihrer sproc die N nicht angeben wird ein Ergebnis mit mehr als einem Tische bekommen. Wenn Sie eine oder mehrere dieser Tabellen aus einem anderen sproc extrahieren müssen, rufen Sie einfach Ihre sproc einen Wert für N. Angabe Sie werden die sproc einmal für jeden Tisch rufen müssen Sie extrahieren möchten. Ineffiziente, wenn Sie brauchen mehr als eine Tabelle aus der Ergebnismenge, aber es funktioniert in reinen TSQL.

Beachten Sie, dass es eine zusätzliche, nicht dokumentierte Beschränkung auf die INSERT INTO ... EXEC-Anweisung: es kann nicht verschachtelt werden. Das heißt, die gespeicherte Prozedur, die die EXEC Anrufe (oder alle, die es wiederum ruft) kann sich eine INSERT INTO ... EXEC nicht. Es scheint, dass es einen einzigen Scratchpad pro Prozess, der das Ergebnis sammelt sich, und wenn sie verschachtelt sind, werden Sie eine Fehlermeldung erhalten, wenn der Anrufer diese öffnet, und dann versucht, der Angerufene es wieder zu öffnen.

Matthieu, müssen Sie getrennte temporäre Tabellen für jeden „Typen“ des Ergebnisses zu halten. Auch, wenn Sie die gleiche mehrmals sind ausführen, müssen Sie möglicherweise eine zusätzliche Spalte zu diesem Ergebnis hinzuzufügen, um anzuzeigen, welche nennen es ergab sich aus.

Leider ist es unmöglich, dies zu tun. Das Problem ist natürlich, dass es keine SQL-Syntax, es zu erlauben. Es passiert ‚unter der Haube‘ natürlich, aber man kann nicht an diesen anderen Ergebnissen in TSQL erhält, nur von der Applikation über ODBC oder was auch immer.

Es gibt einen Weg um sie herum, wie bei den meisten Dingen. Der Trick ist, OLE-Automatisierung in TSQL zu verwenden, um ein ADODB-Objekt zu erstellen, die jeden resultset wiederum öffnet und schreibt die Ergebnisse an die Tabellen, die Sie benennen (oder zu tun, was Sie mit der Result wollen). Sie können es in DMO auch wenn Sie Schmerzen genießen.

Es gibt zwei Möglichkeiten, dies leicht zu tun. Entweder bleiben die Ergebnisse in einer temporären Tabelle und verweist dann auf die temporäre Tabelle von Ihrem sproc. Die andere Alternative ist es, die Ergebnisse in ein XML-Variable zu setzen, die als Ausgangsgröße verwendet wird.

Es gibt jedoch Vor- und Nachteile beider Optionen. Mit einer temporären Tabelle, müssen Sie Code, um das Skript hinzuzufügen, die die rufende Prozedur erstellt die temporäre Tabelle zu erstellen, bevor das Verfahren zu ändern. Außerdem sollten Sie die temporäre Tabelle am Ende des Verfahrens aufzuräumen.

Mit dem XML kann es speicherintensiv und langsam sein.

Sie könnten sie in temporären Tabellen oder Schreibtabelle Wertfunktionen auswählen, um Ergebnismengen zurückgeben. Fragen, wie durch die Ergebnismengen zu durchlaufen?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top