Führen Sie das WITH RESULT SETS-Feature in SQL Server aus

Mit der Einführung von SQL Server 2012 wurde eine nützliche Funktion hinzugefügt: AUSFÜHREN MIT ERGEBNISSE. Diese Funktion ermöglicht es uns Ändern Sie die Spaltennamen und Spaltendatentypen der von einer gespeicherten Prozedur zurückgegebenen Ergebnismengen, ohne den Code der gespeicherten Prozedur tatsächlich zu ändern.

In einem realen Szenario haben wir eine ältere gespeicherte Prozedur, die eine Ergebnismenge mit einer Spalte "CustomerName" mit varchar (50) als Ausgabe anzeigt, und diese wird von der .NET-Front-End-Anwendung zur Ausführung aufgerufen. Aufgrund einer plötzlichen Änderung der Anforderung haben Front-End-Anwendungsentwickler den Code geändert und erwarten den Spaltennamenalias als "CustomerFullName" und die Datentyplänge als varchar (100). Um dies zu beheben, müssen Sie den vorhandenen Code für gespeicherte Prozeduren ändern, um diese neuen Änderungen zu übernehmen, die sich auf andere gespeicherte Prozeduren auswirken können, die davon abhängig sind.

Um eine schnelle Lösung zu finden und die Anforderungsänderungen zu berücksichtigen, können wir die neue Funktion von SQL Server verwenden AUSFÜHREN MIT ERGEBNISSE durch Ändern des Spaltennamensalias und des Datentyps während der Ausführung der gespeicherten Prozeduren. Dies bietet uns den Vorteil, den vorhandenen Code für gespeicherte Prozeduren nicht zu ändern.

1. Ändern des Spaltennamens und des Spaltendatentyps zur Laufzeit, während eine gespeicherte Prozedur ausgeführt wird

2. Kann mit mehreren Ergebnissätzen verwendet werden, die von Abfragen zurückgegeben werden, um die Spaltennamen und Datentypen zur Laufzeit zu ändern

1. Wir können keine Spalten aus einer vorhandenen Ergebnismenge entfernen. Wenn die Ergebnismenge drei Spalten als Ausgabe ergibt, müssen wir alle drei Spalten mit der Option WITH RESULT SETS definieren.

2. Die Reihenfolge der Spalten in der Ergebnismenge kann nicht geändert werden.

3. WITH RESULT SETS kann nicht mit verschachtelt werden INSERT… EXEC Aufruf zum Speichern der Ergebnisse in einer temporären Tabelle.

AUSFÜHREN  WITH RESULT SETS {RESULT SETS UNDEFINED} | {RESULT SETS NONE} | {RESULT SETS ()} 

1. AUSFÜHREN MIT ERGEBNISSEINSTELLUNGEN MIT ERGEBNISSEINSÄTZE UNDEFINIERT

RESULT SETS UNDEFINED ist eine Standardoption mit EXECUTE WITH RESULT SETS. Wenn mit WITH RESULT SETS keine Option angegeben wird, wird diese standardmäßig berücksichtigt. Dies wird ausgeführt, ohne einen Fehler auszulösen, der ggf. die Ergebnismengen zurückgibt.

2. EXECUTE MIT RESULT SETS mit RESULT SETS NONE

RESULT SETS NONE gibt an, dass keine Ergebnissätze von der ausgeführten Anweisung zurückgegeben werden. Wenn diese Option verwendet wird und die Anweisung eine Ergebnismenge zurückgibt, wird ein Fehler ausgegeben.

Wir können ein paar Beispiele durchgehen, eine Tabelle „Player“ erstellen und einige Datensätze einfügen.

WENN OBJECT_ID (N'Player ', N'U') NICHT NULL DROP TABLE-Player ist; GO Create table Spieler (Id INT, Name VARCHAR (100), HighestScore INT); INSERT IN Player VALUES (1, 'Niraj', 120), (2, 'Vish', 51), (3, 'Chetan', 264); 

1. EXECUTE WITH RESULT SETS: Spaltennamen / Datentyp ändern

Wir können eine gespeicherte Prozedur erstellen, um alle Spielernamen und ihre höchste Punktzahl zurückzugeben.

CREATE PROCEDURE GetPlayerNameAndScore AS BEGIN SELECT Name, HighestScore FROM Spieler; ENDE 

Wenn wir die Prozedur wie üblich ausführen, EXEC GetPlayerNameAndScoreerhalten wir die Spalte Name und HighestScore in der Ergebnismenge wie folgt:

EXEC GetPlayerNameAndScore 

In Anbetracht dessen, dass wir die Ergebnismenge mit einem neuen Spaltenalias zurückgeben möchten, ohne die vorhandene gespeicherte Prozedur zu ändern, geben Sie die Ergebnissätze mit PlayerName mit dem Datentyp VARCHAR (50) und der PlayerHighScore-Spalte anstelle ihrer ursprünglichen Namen zurück. Wir können benutzen AUSFÜHREN MIT ERGEBNISSE.

EXEC GetPlayerNameAndScore WITH RESULT SETS ((Spielername VARCHAR (50), PlayerHigherScore INT)); 

Unten sehen Sie, dass der Spaltenalias geändert wurde, um der neuen Änderung zu entsprechen.

2. EXECUTE WITH RESULT SETS: Mehrere Ergebnissätze

Wir können eine gespeicherte Prozedur erstellen, um mehrere Ergebnissätze zurückzugeben: Anzahl der Datensätze in der Spielertabelle und Liste der Spieler, deren Name mit C beginnt

CREATE PROCEDURE Get_Player_Name_Score_Multiple_ResultSets AS BEGIN SELECT Name FROM Spieler WHERE Name Wie 'C%'; SELECT COUNT (1) als MyCount FROM Spieler; ENDE 

Wir können benutzen AUSFÜHREN MIT ERGEBNISSE Um den Alias ​​des ersten Ergebnisses von Name in PlayerName und in der zweiten Ergebnismenge zu ändern, ändern Sie den AlCount-Alias ​​in PlayerCount.

EXEC Get_Player_Name_Score_Multiple_ResultSets WITH RESULT SETS ((Spielername VARCHAR (50) - Erste Ergebnismenge), (PlayerCount INT - Zweite Ergebnismenge)); 

3. EXECUTE WITH RESULT SETS: Spalten stimmen nicht überein

Wir verwenden die in Beispiel 1 erstellte Prozedur. GetPlayerNameAndScore, das gibt zwei Spalten in einer Ergebnismenge zurück, und wenn wir nur eine Spalte mit definieren AUSFÜHREN MIT ERGEBNISSESQL Server verursacht den folgenden Fehler. Daher müssen alle Spalten mit der Option EXECUTE WITH RESULT SETS eingeschlossen werden.

Der Versuch, nur die erste Spalte in eine Ergebnismenge aufzunehmen, ist nicht zulässig.

EXEC GetPlayerNameAndScore WITH RESULT SETS ((Spielername VARCHAR (50))); 

Meldung 11537, Ebene 16, Status 1, Prozedur GetPlayerNameAndScore, Zeile 4
Die EXECUTE-Anweisung ist fehlgeschlagen, weil ihre WITH RESULT SETS-Klausel eine oder mehrere Spalten für die Ergebnismenge 1 angegeben hat, die Anweisung jedoch zur Laufzeit zwei Spalten sendete.