dm_exec_describe_first_result_set_for_object para múltiples conjuntos de resultados

9

¿Existe un procedimiento para devolver metadatos para todos los conjuntos de resultados en un procedimiento almacenado?

Algo así sys.dm_exec_describe_first_result_set_for_object, pero para todos los conjuntos de resultados?

Eventualmente, querré descubrir los metadatos para cada conjunto de resultados en cada procedimiento almacenado en la base de datos. Por ahora, me conformaría con los conjuntos de resultados que sys.dm_exec_describe_first_result_set_for_objectno pueden describir. Es decir, el segundo, tercer y enésimo conjunto de resultados.

Mirando el uso de SQLCLR para hacer esto ahora:

Cómo guardar los resultados de un procedimiento con más de un conjunto de resultados
tSQLt - Prueba de unidad de base de datos para SQL Server - ResultSetFilter.cs

JJS
fuente
3
No, no existe tal cosa en SQL Server, tendría que escribir código para hacerlo (y probablemente tendría que hacer conjeturas en muchos casos).
Aaron Bertrand

Respuestas:

3

¿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, 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).

Solomon Rutzky
fuente