获取从存储过程返回的列名称/类型

时间:2010-09-19 23:20:21

标签: sql-server stored-procedures metadata

是否有通过元数据的方法(可能是Information_Schema?)来获取sproc将返回的列的列表?我正在尝试自动化一些代码生成,这将极大地帮助......

3 个答案:

答案 0 :(得分:14)

除非您准备在INFORMATION_SCHEMA.ROUTINES中解析ROUTINE_DEFINITION的内容,否则最好的办法是执行这些程序,并从返回的记录中读取列信息。

在.NET中,您可以通过将存储过程的结果读入DataTable并查询Columns属性来完成此操作。

没有简单方法可以做到这一点的原因是存储过程可能会根据参数返回不同的结果集。没有固定的结果集格式,就像用户定义的函数一样。

修改

如其他答案中所述,您需要使用SET FMTONLY ON以确保不返回任何数据。在某些情况下,SET FMTONLY将无法工作,例如在存储过程中使用#temp表时,有一个workaround

答案 1 :(得分:10)

我刚刚运行了Profiler,看看Visual Studio如何为强类型数据集拖放做这件事。

这是它发送的代码。

 SET NO_BROWSETABLE ON; 
 SET FMTONLY ON;

exec dbo.aspnet_Roles_GetAllRoles @ApplicationName=NULL

所以我认为可能没有任何“更正式”的方式。

显然,您需要记住,单个存储过程可能会返回多个结果集或不同的结果集,具体取决于传递的参数。

对于2012年以上的人,另一种方法可能是使用sp_describe_first_result_set

答案 2 :(得分:3)

我这样做的方式: 编辑存储过程以获得INTO子句:

更改

Select * from tablename

Select * INTO _tablename FROM tablename

这会在数据库中创建一个表。 然后,使用SELECT * FROM INFORMATION_SCHEMA WHERE TABLE_NAME = '_tablename'

不要忘记撤消对sproc的修改。