JJS*_*JJS 9 sql-server metadata sql-clr
是否存在为存储过程中的所有结果集返回元数据的过程?
类似于sys.dm_exec_describe_first_result_set_for_object
,但对于所有结果集?
最终,我想发现数据库中每个存储过程中每个结果集的元数据。现在,我只会满足于sys.dm_exec_describe_first_result_set_for_object
无法描述的结果集。即第 2、第 3 和第 N 个结果集。
现在考虑使用 SQLCLR 来执行此操作:
如何保存具有多个结果集的过程的结果
tSQLt - SQL Server 的 DB 单元测试 - ResultSetFilter.cs
是否存在一个过程可以返回存储过程中所有结果集的元数据?
否和是。
没有纯 T-SQL 方法可以访问第一个结果集以外的内容。即使OPENROWSET和OPENQUERY也有相同的限制:
尽管查询可能返回多个结果集,但 OPEN(ROWSET|QUERY) 仅返回第一个结果集。
根据记录,我既没有说也没有暗示这种限制存在任何常见的技术原因。我只是指出限制并不限于sp_describe_first_result_set
、、sys.dm_exec_describe_first_result_set
和sys.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#库的一部分(我是该库的作者,虽然有免费版本,但 DB_DescribeResultSets 仅在完整版本中可用)。
归档时间: |
|
查看次数: |
1592 次 |
最近记录: |