Con l'introduzione di SQL Server 2012, è stata inclusa una funzionalità utile: ESEGUI CON I SET DI RISULTATI. Questa funzionalità ci consente di modificare i nomi di colonna e i tipi di dati di colonna dei set di risultati restituiti da una stored procedure senza effettivamente modificare il codice di stored procedure.
In uno scenario reale, abbiamo una procedura memorizzata legacy che mostra un set di risultati con una colonna "CustomerName" avente varchar (50) come output, ed è chiamata dall'applicazione front end .NET per essere eseguita. A causa di un'improvvisa modifica dei requisiti, gli sviluppatori di applicazioni front-end hanno modificato il codice e si aspettano che l'alias del nome della colonna sia "CustomerFullName" e la lunghezza del tipo di dati come varchar (100). Per risolvere questo problema, è necessario modificare il codice di stored procedure esistente per aderire a queste nuove modifiche, il che potrebbe influire su altre stored procedure che ne dipendono.
Per effettuare una correzione rapida e prendere in considerazione le modifiche ai requisiti, è possibile utilizzare la nuova funzionalità di SQL Server ESEGUI CON I SET DI RISULTATI modificando l'alias e il tipo di dati della colonna durante l'esecuzione delle stored procedure. Questo ci dà il vantaggio di non modificare il codice di procedura memorizzato esistente.
1. Per modificare il nome della colonna e il tipo di dati della colonna in fase di esecuzione durante l'esecuzione di una stored procedure
2. Può essere utilizzato con più set di risultati restituiti dalle query per modificare i nomi delle colonne e i tipi di dati in fase di esecuzione
1. Non possiamo rimuovere alcuna colonna da un set di risultati esistente. Se il set di risultati fornisce tre colonne come output, è necessario definire tutte e tre le colonne utilizzando l'opzione WITH RESULT SETS.
2. Non possiamo cambiare l'ordine delle colonne nel set di risultati.
3. CON I SET RISULTATI non possono essere nidificati con INSERISCI ... ESEC chiama per memorizzare i risultati in una tabella temporanea.
ESEGUIRECON SET DI RISULTATI {SET RISULTATI NON DEFINITI} | {SET RISULTATI NESSUNO} | {SET RISULTATI ()}
1. ESEGUI CON SET DI RISULTATI con SET RISULTATI NON DEFINITI
RESULT SETS UNDEFINED è un'opzione predefinita con EXECUTE WITH RESULT SETS. Se non viene specificata alcuna opzione utilizzando WITH RESULT SETS, questa viene considerata per impostazione predefinita. Esegue senza generare alcun errore restituendo i set di risultati, se presenti.
2. ESEGUI CON I SET RISULTATI con SET RISULTATI NESSUNO
SET DI RISULTATI NESSUNO indica che nessun set di risultati sarà restituito dall'istruzione eseguita. Se questa opzione viene utilizzata e l'istruzione restituisce un qualsiasi set di risultati, genera un errore.
Possiamo guidare attraverso alcuni esempi, creando una tabella "Player" e inserendo pochi record.
IF OBJECT_ID (N'Player ', N'U') NON È NULL DROP TABLE Player; GO Crea tabella Player (ID INT, Nome VARCHAR (100), HighestScore INT); INSERISCI I VALORI del giocatore (1, 'Niraj', 120), (2, 'Vish', 51), (3, 'Chetan', 264);
1. ESEGUI CON I SET RISULTATI: Modifica nome colonna / Tipo dati
Possiamo creare una stored procedure per restituire tutti i nomi dei giocatori e il loro punteggio più alto.
CREATE PROCEDURE GetPlayerNameAndScore AS BEGIN SELECT Name, HighestScore FROM Player; FINE
Se eseguiamo la procedura nel solito modo, GetPlayerNameAndScore EXEC, otterremo la colonna Name e HighestScore nel set di risultati come segue:
GetPlayerNameAndScore EXEC
Considerando ora di voler restituire il set di risultati con un nuovo alias di colonna senza modificare la stored procedure esistente, restituire i set di risultati con PlayerName con il tipo di dati VARCHAR (50) e la colonna PlayerHighScore invece dei loro nomi originali. Possiamo usare ESEGUI CON I SET DI RISULTATI.
EXEC GetPlayerNameAndScore WITH RESULT SETS ((PlayerName VARCHAR (50), PlayerHigherScore INT));
Sotto, puoi vedere l'alias della colonna è stato modificato per aderire alla nuova modifica.
2. ESEGUI CON SET DI RISULTATI: Set di risultati multipli
Possiamo creare una stored procedure per restituire più set di risultati: Numero di record nella tabella Player e Elenco di giocatori il cui nome inizia con C.
CREATE PROCEDURE Get_Player_Name_Score_Multiple_ResultSets AS BEGIN SELECT Nome FROM Player WHERE Nome Like 'C%'; SELECT COUNT (1) come MyCount FROM Player; FINE
Possiamo usare ESEGUI CON I SET DI RISULTATI per cambiare l'alias del primo risultato da Nome a PlayerName e nel secondo set di risultati, per cambiare l'alias MyCount in PlayerCount.
Get_Player_Name_Score_Multiple_ResultSets Exec set di risultati ((playername VARCHAR (50) - primo set di risultati), (PlayerCount INT - Second Set Risultato));
3. ESEGUI CON I SET DI RISULTATI: Errore di corrispondenza mancata colonne
Stiamo usando la procedura creata nell'Esempio 1, GetPlayerNameAndScore, che restituisce due colonne in un set di risultati e se definiamo solo una colonna con ESEGUI CON I SET DI RISULTATI, SQL server genera il seguente errore. Pertanto è necessario includere tutte le colonne con l'opzione ESEGUI CON RISULTATI SET.
Non è consentito provare a includere solo la prima colonna in un set di risultati.
EXEC GetPlayerNameAndScore WITH RESULT SETS ((PlayerName VARCHAR (50)));
Messaggio 11537, livello 16, stato 1, procedura GetPlayerNameAndScore, riga 4
L'istruzione EXECUTE non è riuscita perché la clausola WITH RESULT SETS ha specificato una colonna (s) per il set di risultati numero 1, ma la dichiarazione ha inviato due colonne in fase di esecuzione.