dm_exec_describe_first_result_set_for_object用于多个结果集


9

是否存在用于返回存储过程中所有结果集的元数据的过程?

类似于sys.dm_exec_describe_first_result_set_for_object,但适用于所有结果集?

最终,我将要发现数据库中每个存储过程中每个结果集的元数据。现在,我将只解决sys.dm_exec_describe_first_result_set_for_object无法描述的结果集。即,第二,第三和第N个结果集。

现在考虑使用SQLCLR来执行此操作:

如何保存具有多个结果集tSQLt 的过程的结果
-SQL Server的数据库单元测试-ResultSetFilter.cs


3
不,SQL Server中没有这样的东西,您必须编写代码才能做到这一点(而且在很多情况下,您可能不得不做出猜测)。
亚伦·伯特兰

Answers:


3

是否存在用于返回存储过程中所有结果集的元数据的过程?

不,是的。

没有

除了第一个结果集以外,没有其他纯粹的T-SQL手段可以访问更多内容。甚至OPENROWSETOPENQUERY也有相同的限制:

尽管查询可能返回多个结果集,但是OPEN(ROWSET | QUERY)仅返回第一个结果集。

出于记录目的,我既没有在说也没有暗示对此限制有任何常见的技术原因。我只是指出了限制,并不仅限于sp_describe_first_result_setsys.dm_exec_describe_first_result_setsys.dm_exec_describe_first_result_set_for_object

捕获信息的唯一方法-结果集元数据甚至结果-对于结果集2-n都是通过应用程序代码。您将首先使用SqlCommand.ExecuteReader(CommandBehavior)CommandBehavior为来执行查询/存储过程KeyInfo。然后,您可以使用SqlDataReader.GetSchemaTable方法获取结果集元数据,并调用SqlDataReader.NextResult方法以循环遍历结果集。请记住,虽然通过应用程序代码执行此操作并没有不使用动态SQL和临时表的限制,但它确实实际上运行SQL代码,并且如果您有DML语句并且只希望结果集元数据而不引起任何数据更改,则必须将要测试的SQL包装在BEGIN TRAN/中ROLLBACK TRAN

应用程序的类型可以是常规Windows应用程序,控制台应用程序,Web应用程序等,甚至可以是SQLCLR函数/存储过程。

关于通过SQLCLR执行此操作,已经存在执行此处所述操作的存储过程。它称为DB_DescribeResultSets,是SQL#库的一部分(我是SQL#库的作者,虽然有免费版本,但DB_DescribeResultSets仅在完整版本中可用)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.