Exekvera med resultat satser i SQL Server

Med introduktionen av SQL Server 2012 inkluderades en användbar funktion: EXECUTE MED RESULTATSÄTT. Den här funktionen tillåter oss att Ändra kolumnnamnen och kolumndatatyperna av resultatuppsättningarna som returneras av en lagrad procedur utan att faktiskt ändra den lagrade procedurkoden.

I en verklig världsscenario har vi ett arv lagrat förfarande som visar en resultatuppsättning med en kolumn "Kundnamn" med varchar (50) som utgång, och det kallas från .NET front end-applikationen för att exekvera. På grund av en plötslig förändring av ändringar har programansvariga för avancerade ändringar ändrat koden och förväntar sig kolumnnamnalias som "CustomerFullName" och datatypslängd som varchar (100). För att åtgärda detta måste vi ändra den befintliga lagrade procedurkoden för att följa dessa nya ändringar, vilket kan påverka några andra lagrade procedurer som är beroende av det.

För att göra en snabbkorrigering och överväga kraven ändras kan vi använda SQL Server nya funktion EXECUTE MED RESULTATSÄTT genom att ändra kolumnnamnalias och datatyp medan du kör de lagrade procedurerna. Detta ger oss fördelen att vi inte ändrar den befintliga lagrade procedurkoden.

1. Ändra kolumnnamn och kolumndatatyp vid körning medan du kör en lagrad procedur

2. Kan användas med flera resultatuppsättningar som returneras av frågor för att ändra kolumnnamn och datatyper vid körning

1. Vi kan inte ta bort någon kolumn från en befintlig resultatuppsättning. Om resultatuppsättningen ger tre kolumner som utgång, måste vi definiera alla tre kolumnerna med alternativet MED RESULTATÄT.

2. Vi kan inte ändra kolumnernas ordning i resultatuppsättningen.

3. MED RESULTATSATSER kan inte nästas med INSERT ... EXEC Ring för att lagra resultaten i en tillfällig tabell.

KÖR  MED RESULTATLÄGGEN {RESULTATÄLLNINGAR ODEFINERADE} | {RESULTAT SÄTT NONE} | {RESULTATÄTTER ()} 

1. EXECUTE WITH RESULT SETS med RESULTATÄTNINGAR ODEFINERADE

RESULTATSÄTTNINGAR ODEFINERADE är ett standardalternativ med EXECUTE WITH RESULT SETS. Om inget alternativ anges med hjälp av RESULTATÄTTER, anses detta som standard. Detta körs utan att det uppstår något fel som returnerar resultatuppsättningarna, om sådana finns.

2. EXECUTE WITH RESULT SETS med RESULTATSÄTTNINGAR NONE

RESULTATLÄGGAR INGEN indikerar att inga resultatuppsättningar kommer att returneras av det genomförda uttalandet. Om det här alternativet används och att satsen returnerar någon resultatsuppsättning uppstår ett fel.

Vi kan driva igenom några exempel, skapa ett bord "Player" och infoga några poster.

Om OBJECT_ID (N'Player ', N'U') ÄR INTE NULL DROP TABLE Player; GO Skapa bordspelare (Id INT, Namn VARCHAR (100), HighestScore INT); INSÄTT IN I SPELARVÄRDEN (1, 'Niraj', 120), (2, 'Vish', 51), (3, 'Chetan', 264); 

1. EXECUTE WITH RESULT SETS: Ändra kolumnnamn / datatyp

Vi kan skapa en lagrad procedur för att returnera alla spelarnamn och deras högsta poäng.

SKAPA PROCEDURE GetPlayerNameAndScore AS BEGIN SELECT Namn, HighestScore FROM Player; SLUTET 

Om vi ​​utför förfarandet på vanligt sätt, EXEC GetPlayerNameAndScore, vi kommer att få kolumnen Namn och Högsta resultat i resultatuppsättningen enligt följande:

EXEC GetPlayerNameAndScore 

Med tanke på att vi vill återställa resultatuppsättningen med ett nytt kolumnalias utan att ändra den befintliga lagrade proceduren, returnera resultatuppsättningarna med PlayerName med kolumn VARCHAR (50) datatyp och PlayerHighScore istället för deras ursprungliga namn. Vi kan använda EXECUTE MED RESULTATSÄTT.

EXEC GetPlayerNameAndScore MED RESULTATSSÄTT ((Spelarens namn VARCHAR (50), PlayerHigherScore INT)); 

Nedan kan du se kolumnaliaset har ändrats för att följa den nya ändringen.

2. EXECUTE MED RESULTATSETER: Flera resultatuppsättningar

Vi kan skapa en lagrad procedur för att returnera flera resultatuppsättningar: Antal poster i spelarbordet och lista över spelare vars namn börjar med C.

SKAPA PROCEDURE Get_Player_Name_Score_Multiple_ResultSets AS BEGIN SELECT Namn FRÅN spelare WHERE Namn gillar 'C%'; VÄLJ COUNT (1) som MyCount FROM Player; SLUTET 

Vi kan använda EXECUTE MED RESULTATSÄTT för att ändra aliaset för det första resultatet från Namn till PlayerName och i den andra resultatuppsättningen, för att ändra MyCount-aliaset till PlayerCount.

EXEC Get_Player_Name_Score_Multiple_ResultSets WITH RESULT SETS ((Spelarens namn VARCHAR (50) - Första resultat Set), (PlayerCount INT - Second Result Set)); 

3. EXECUTE WITH RESULT SETS: Columns Mismatch Error

Vi använder proceduren som skapades i exempel 1, GetPlayerNameAndScore, som returnerar två kolumner i en resultatuppsättning, och om vi bara definierar en kolumn med EXECUTE MED RESULTATSÄTT, Ökar SQL-servern följande fel. Således är det nödvändigt att inkludera alla kolumner med alternativet EXECUTE WITH RESULT SETS.

Att försöka inkludera endast den första kolumnen i en resultatuppsättning är inte tillåtet.

EXEC GetPlayerNameAndScore MED RESULTATSSÄTT ((Spelarnamn VARCHAR (50))); 

Msg 11537, Nivå 16, Stat 1, Förfarande GetPlayerNameAndScore, Linje 4
EXECUTE-meddelandet misslyckades eftersom dess med RESULTATSETT-klausulen angav en kolumn (er) för resultatuppsättningsnummer 1, men uttalandet skickade två kolumner i körtiden.