Existe-t-il une procédure pour renvoyer des métadonnées pour tous les jeux de résultats d'une procédure stockée?
Non et oui.
Non
Il n'existe aucun moyen T-SQL pur d'accéder à plus que le premier jeu de résultats. Même OPENROWSET et OPENQUERY ont la même limitation:
Bien que la requête puisse renvoyer plusieurs jeux de résultats, OPEN (ROWSET | QUERY) ne renvoie que le premier.
Pour mémoire, je ne dis ni n'implique qu'il existe une raison technique commune à cette limitation. Je signale que la limitation ne se limite pas à sp_describe_first_result_set
, sys.dm_exec_describe_first_result_set
et sys.dm_exec_describe_first_result_set_for_object
.
Oui
La seule façon de capturer des informations - les métadonnées de l'ensemble de résultats et même les résultats - pour les ensembles de résultats 2 - n est via le code d'application. Vous devez d'abord exécuter les requêtes / procédures stockées à l'aide de SqlCommand.ExecuteReader (CommandBehavior) avec un CommandBehavior de KeyInfo
. Ensuite, vous pouvez obtenir les métadonnées de l'ensemble de résultats à l'aide de la méthode SqlDataReader.GetSchemaTable et en appelant la méthode SqlDataReader.NextResult pour parcourir les ensembles de résultats. Gardez à l'esprit que, tout en effectuant cela via le code d'application, il n'a pas les limites de ne pas travailler avec Dynamic SQL et les tables temporaires, il le faitexécutez réellement le code SQL, et si vous avez des instructions DML et que vous ne voulez que les métadonnées du jeu de résultats sans provoquer de modifications de données, vous devrez encapsuler le SQL que vous testez dans un BEGIN TRAN
/ ROLLBACK TRAN
.
Le type d'application peut être une application Windows standard, une application console, une application Web, etc., ou il peut même s'agir d'une fonction / procédure stockée SQLCLR.
En ce qui concerne le faire via SQLCLR, il existe déjà une procédure stockée qui fait ce qui est décrit ici. Il s'appelle DB_DescribeResultSets et fait partie de la bibliothèque SQL # (dont je suis l'auteur, et bien qu'il existe une version gratuite, DB_DescribeResultSets n'est disponible que dans la version complète).