Fonctionnalité Exécuter WITH RESULT SETS dans SQL Server

Avec l'introduction de SQL Server 2012, une fonctionnalité utile était incluse: EXÉCUTER AVEC LES ENSEMBLES DE RÉSULTATS. Cette fonctionnalité nous permet de modifier les noms de colonne et les types de données de colonne des jeux de résultats renvoyés par une procédure stockée sans modifier réellement le code de la procédure stockée.

Dans un scénario réel, nous avons une procédure stockée héritée qui affiche un ensemble de résultats avec une colonne «NomClient» ayant varchar (50) en sortie et l'appelant à exécuter à partir de l'application frontale .NET. En raison d'un changement soudain des exigences, les développeurs d'applications front-end ont modifié le code et s'attendent à ce que l'alias du nom de la colonne soit «CustomerFullName» et que la longueur du type de données soit varchar (100). Pour résoudre ce problème, nous devons modifier le code de procédure stockée existant pour qu'il adhère à ces nouvelles modifications, ce qui pourrait avoir une incidence sur certaines autres procédures stockées dépendantes de celui-ci.

Pour apporter une solution rapide et prendre en compte les modifications des exigences, nous pouvons utiliser la nouvelle fonctionnalité de SQL Server. EXÉCUTER AVEC LES ENSEMBLES DE RÉSULTATS en modifiant l'alias du nom de la colonne et le type de données lors de l'exécution des procédures stockées. Cela nous donne l'avantage de ne pas modifier le code de procédure stockée existant.

1. Pour modifier le nom et le type de données de la colonne au moment de l'exécution lors de l'exécution d'une procédure stockée

2. Peut être utilisé avec plusieurs jeux de résultats renvoyés par des requêtes pour modifier les noms de colonne et les types de données à l'exécution

1. Nous ne pouvons supprimer aucune colonne d'un ensemble de résultats existant. Si le jeu de résultats donne trois colonnes en sortie, nous devons définir ces trois colonnes à l'aide de l'option WITH RESULT SETS.

2. Nous ne pouvons pas modifier l'ordre des colonnes dans le jeu de résultats.

3. WITH SET RESULT ne peut pas être imbriqué INSERT… EXEC appelez pour stocker les résultats dans une table temporaire.

EXÉCUTER  WITH RESULT SETS {RESULT SETS UNDEFINED} | {RESULT SETS NONE} | {ENSEMBLES DE RÉSULTATS ()} 

1. EXÉCUTER AVEC LES ENSEMBLES DE RÉSULTATS avec LES ENSEMBLES DE RÉSULTATS NON DÉFINIS

RESULT SETS UNDEFINED est une option par défaut avec EXECUTE WITH RESULT SETS. Si aucune option n'est spécifiée à l'aide de WITH RESULT SETS, cette option est considérée par défaut. Ceci s’exécute sans générer d’erreur en renvoyant les ensembles de résultats, s’il en existe.

2. EXÉCUTER AVEC LES ENSEMBLES DE RÉSULTATS avec LES ENSEMBLES DE RÉSULTATS NONE

RESULT SETS NONE indique qu'aucun résultat ne sera renvoyé par l'instruction exécutée. Si cette option est utilisée et que l'instruction retourne un jeu de résultats, une erreur est générée.

Nous pouvons parcourir quelques exemples en créant une table «Player» et en insérant quelques enregistrements.

SI OBJECT_ID (N'Player ', N'U') N'EST PAS NUL DROP TABLE Player; GO Create table Player (Id INT, Nom VARCHAR (100), MostScore INT); INSCRIRE DANS LES VALEURS du joueur (1, 'Niraj', 120), (2, 'Vish', 51), (3, 'Chetan', 264); 

1. EXÉCUTER AVEC LES ENSEMBLES DE RÉSULTATS: Modifier le nom de la colonne / le type de données

Nous pouvons créer une procédure stockée pour renvoyer tous les noms de joueurs et leur score le plus élevé.

CREATE PROCEDURE GetPlayerNameAndScore AS BEGIN SELECT Nom, résultat le plus élevé FROM Joueur; FIN 

Si nous exécutons la procédure de la manière habituelle, EXEC GetPlayerNameAndScore, nous obtiendrons la colonne Nom et Résultat le plus élevé dans le jeu de résultats comme suit:

EXEC GetPlayerNameAndScore 

Maintenant, si vous souhaitez renvoyer le jeu de résultats avec un nouvel alias de colonne sans modifier la procédure stockée existante, renvoyez les jeux de résultats avec PlayerName avec le type de données VARCHAR (50) et la colonne PlayerHighScore au lieu de leurs noms d'origine. On peut utiliser EXÉCUTER AVEC LES ENSEMBLES DE RÉSULTATS.

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

Ci-dessous, vous pouvez voir que l'alias de colonne a été modifié pour adhérer à la nouvelle modification.

2. EXÉCUTER AVEC LES ENSEMBLES DE RÉSULTATS: Plusieurs ensembles de résultats

Nous pouvons créer une procédure stockée pour renvoyer plusieurs jeux de résultats: Nombre d'enregistrements dans la table des joueurs et la liste des joueurs dont le nom commence par C.

CREATE PROCEDURE Get_Player_Name_Score_Multiple_ResultSets AS BEGIN SELECT Nom du joueur WHERE Nom comme 'C%'; SÉLECTIONNER COUNT (1) en tant que MyCount FROM Player; FIN 

On peut utiliser EXÉCUTER AVEC LES ENSEMBLES DE RÉSULTATS pour changer l'alias du premier résultat de Name en PlayerName et dans le second jeu de résultats, pour changer l'alias MyCount en PlayerCount.

EXEC Get_Player_Name_Score_Multiple_ResultSets WITH RESULT SETS ((PlayerName VARCHAR (50) - Premier jeu de résultats), (PlayerCount INT - Deuxième jeu de résultats)); 

3. EXECUTE WITH RESULT SETS: erreur de correspondance de colonnes

Nous utilisons la procédure créée dans l'exemple 1, GetPlayerNameAndScore, qui renvoie deux colonnes dans un jeu de résultats, et si nous définissons une seule colonne avec EXÉCUTER AVEC LES ENSEMBLES DE RÉSULTATS, SQL Server déclenche l'erreur suivante. Il est donc nécessaire d’inclure toutes les colonnes avec l’option EXECUTE WITH RESULT SETS.

Essayer d'inclure uniquement la première colonne d'un ensemble de résultats n'est pas autorisé.

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

Msg 11537, Niveau 16, Etat 1, Procédure GetPlayerNameAndScore, Ligne 4
L'instruction EXECUTE a échoué car sa clause WITH RESULT SETS spécifiait une colonne pour l'ensemble de résultats numéro 1, mais l'instruction envoyait deux colonnes au moment de l'exécution.