¿Existe un procedimiento para devolver metadatos para todos los conjuntos de resultados en un procedimiento almacenado?
No y sí.
No
No hay un medio T-SQL puro para acceder a más que el primer conjunto de resultados. Incluso OPENROWSET y OPENQUERY tienen la misma limitación:
Aunque la consulta puede devolver múltiples conjuntos de resultados, OPEN (ROWSET | QUERY) devuelve solo el primero.
Para el registro, no estoy diciendo ni insinuando que haya alguna razón técnica común para esta limitación. Sólo estoy señalando que la limitación no se limita a sp_describe_first_result_set
, sys.dm_exec_describe_first_result_set
, y sys.dm_exec_describe_first_result_set_for_object
.
si
La única forma de capturar información (metadatos del conjunto de resultados e incluso los resultados) para los conjuntos de resultados 2 - n es a través del código de la aplicación. Primero ejecutaría las consultas / procedimientos almacenados utilizando SqlCommand.ExecuteReader (CommandBehavior) con un CommandBehavior de KeyInfo
. Luego, puede obtener los metadatos del conjunto de resultados utilizando el método SqlDataReader.GetSchemaTable y llamando al método SqlDataReader.NextResult para recorrer los conjuntos de resultados. Solo tenga en cuenta que si bien hacer esto a través del código de la aplicación no tiene las limitaciones de no trabajar con SQL dinámico y tablas temporales, síen realidad ejecute el código SQL, y si tiene instrucciones DML y solo desea que los metadatos del conjunto de resultados sin causar ningún cambio en los datos, tendrá que ajustar el SQL que está probando en un BEGIN TRAN
/ ROLLBACK TRAN
.
El tipo de aplicación puede ser una aplicación normal de Windows, una aplicación de consola, una aplicación web, etc., o incluso puede ser una función SQLCLR / procedimiento almacenado.
Con respecto a hacer esto a través de SQLCLR, ya existe un procedimiento almacenado que hace lo que se describe aquí. Se llama DB_DescribeResultSets y forma parte de la biblioteca SQL # (de la que soy autor, y aunque hay una versión gratuita, DB_DescribeResultSets solo está disponible en la versión completa).