¿Hay alguna forma a través de metadatos (Information_Schema, quizás?) Para obtener una lista de las columnas que devolverá sproc? Estoy tratando de automatizar la generación de código y eso ayudaría enormemente ...Obtener nombres/tipos de columna devueltos de un procedimiento almacenado
Respuesta
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.
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
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.
- 1. Obtener valores devueltos de un procedimiento almacenado de MySQL en Python, usando MySQLdb
- 2. Ejecutar un procedimiento almacenado dentro de un procedimiento almacenado
- 3. agregando una columna en el procedimiento almacenado
- 4. Procedimiento almacenado al ejecutar otro procedimiento almacenado
- 5. Cómo llamar a un procedimiento almacenado desde otro procedimiento almacenado?
- 6. Cómo obtener el valor devuelto de un procedimiento almacenado
- 7. Transacción de procedimiento almacenado
- 8. ¿Cómo suprimo los resultados de un procedimiento almacenado dentro de un procedimiento almacenado?
- 9. Valores devueltos del procedimiento de Python
- 10. Seleccionar y actualizar en un procedimiento almacenado
- 11. ¿Cómo programar un procedimiento almacenado?
- 12. Cómo guardar un procedimiento almacenado?
- 13. Procedimiento almacenado NULL Parámetro
- 14. ¿Cómo desactivo los resultados de la consulta al ejecutar un procedimiento almacenado desde un procedimiento almacenado?
- 15. Obtener conjunto de resultados del procedimiento almacenado de Oracle
- 16. ¿Cómo ejecutar un procedimiento almacenado de Oracle?
- 17. ¿Cómo devuelvo XML de un procedimiento almacenado?
- 18. la salida de un procedimiento almacenado
- 19. Devolviendo múltiples valores de un procedimiento almacenado
- 20. Consultar resultados de un procedimiento almacenado
- 21. Comparar dos versiones de un procedimiento almacenado
- 22. Obtener valor de retorno de procedimiento almacenado en C#
- 23. procedimiento almacenado - forzando orden de ejecución
- 24. TSQL: llame a un procedimiento almacenado desde otro procedimiento almacenado y lea el resultado
- 25. T-SQL obtener el valor seleccionado de procedimiento almacenado
- 26. Obtener el valor de retorno del procedimiento almacenado en ADO.NET
- 27. Procedimiento almacenado consulta de eliminación
- 28. Cómo crear un procedimiento almacenado dentro de otro procedimiento almacenado en SQL Server 2008
- 29. procedimiento almacenado devuelve varchar
- 30. ¿Cómo implementar un procedimiento almacenado condicional Upsert?
Para SQL2012, siga los consejos en esta publicación: http://stackoverflow.com/a/14575114/569662 –
Si Microsoft sigue desaprobando DataTable en .NET Core, este método dejará de funcionar si se traslada a Core. –