2010-09-19 81 views

回答

13

除非你准备解析INFORMATION_SCHEMA.ROUTINES中的ROUTINE_DEFINITION的内容,那么你最好的选择将是执行程序,并阅读来自记录的列信息被返回。

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

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

编辑

正如在其他答复中提到,您将需要使用SET FMTONLY ON,以确保不会返回任何数据。 SET FMTONLY在某些情况下不起作用,例如在存储过程中使用#temp表时,但存在workaround

+0

对于SQL2012,请按照本文中的建议操作:http://stackoverflow.com/a/14575114/569662 – 2016-04-15 09:40:57

+0

如果Microsoft坚持在.NET Core中弃用DataTable,那么如果您转移到Core,此方法将停止工作。 – 2016-09-16 19:34:49

9

我刚刚运行了Profiler来查看Visual Studio如何为强类型的数据集拖放操作。

这是它发送的代码。

SET NO_BROWSETABLE ON; 
SET FMTONLY ON; 

exec dbo.aspnet_Roles_GetAllRoles @ApplicationName=NULL 

所以我认为可能没有任何“更正式”的方式来做到这一点。

显然你需要记住单个存储过程可能会返回多个结果集或依赖于传递的参数的不同结果集。

对于人们对2012+的另一种方法可能是使用sp_describe_first_result_set

1

我这样做的方式: 编辑存储过程有一个INTO子句:

变化

Select * from tablename 

Select * INTO _tablename FROM tablename 

这产生了数据库中的表。 然后,使用SELECT * FROM INFORMATION_SCHEMA WHERE TABLE_NAME = '_tablename'

不要忘记取消对存储区的修改。