2010-09-19 6 views

Respuesta

13

A menos que esté preparado para analizar el contenido de ROUTINE_DEFINITION en INFORMATION_SCHEMA.ROUTINES, entonces su mejor opción será ejecutar los procedimientos y leer la información de la columna de los registros devueltos.

En .NET puede hacerlo leyendo los resultados del procedimiento almacenado en una DataTable y consultando la propiedad Columns.

El motivo por el que no existe una forma sencilla de hacerlo es que un procedimiento almacenado podría devolver diferentes conjuntos de resultados según los parámetros. No hay un formato de conjunto de resultados fijo como el que hay con las funciones definidas por el usuario.

Editar

Como se mencionó en la otra respuesta, tendrá que utilizar SET FMTONLY ON para asegurar no se devuelven datos. Hay algunas situaciones en las que SET FMTONLY no funcionará, p. cuando usa tablas #temp en sus procedimientos almacenados, pero hay un workaround.

+0

Para SQL2012, siga los consejos en esta publicación: http://stackoverflow.com/a/14575114/569662 –

+0

Si Microsoft sigue desaprobando DataTable en .NET Core, este método dejará de funcionar si se traslada a Core. –

9

Acabo de ejecutar Profiler para ver cómo Visual Studio hace esto para el conjunto de datos fuertemente tipado de arrastrar y soltar.

Este es el código que envió.

SET NO_BROWSETABLE ON; 
SET FMTONLY ON; 

exec dbo.aspnet_Roles_GetAllRoles @ApplicationName=NULL 

Supongo que puede que no haya una forma "más oficial" de hacerlo.

Obviamente, debe tener en cuenta que un solo procedimiento almacenado puede devolver varios conjuntos de resultados o diferentes conjuntos de resultados en función de los parámetros aprobados.

Para la gente en 2012+ otro enfoque podría ser utilizar sp_describe_first_result_set

1

Mi forma de hacer esto: Editar el procedimiento almacenado para tener una cláusula INTO:

Cambio

Select * from tablename 

a

Select * INTO _tablename FROM tablename 

Esto crea un tabla en la base de datos. Luego, use SELECT * FROM INFORMATION_SCHEMA WHERE TABLE_NAME = '_tablename'

No olvide deshacer la modificación en el sproc.

Cuestiones relacionadas