dm_exec_describe_first_result_set_for_object pour plusieurs jeux de résultats

9

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?

Quelque chose comme sys.dm_exec_describe_first_result_set_for_object, mais pour tous les jeux de résultats?

Finalement, je souhaiterai découvrir les métadonnées pour chaque jeu de résultats dans chaque procédure stockée dans la base de données. Pour l'instant, je me contenterais des jeux de résultats qui sys.dm_exec_describe_first_result_set_for_objectne peuvent pas être décrits. Autrement dit, les 2e, 3e et Ne jeux de résultats.

Vous envisagez d'utiliser SQLCLR pour le faire maintenant:

Comment enregistrer les résultats d'une procédure avec plusieurs jeux de résultats
tSQLt - Test d'unité de base de données pour SQL Server - ResultSetFilter.cs

JJS
la source
3
Non, il n'y a rien de tel dans SQL Server, vous devrez écrire du code pour le faire (et vous devrez probablement faire des suppositions dans de nombreux cas).
Aaron Bertrand

Réponses:

3

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_setet 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).

Solomon Rutzky
la source