我想知道每个大量未记录的存储过程返回了多少个表。
有没有办法以编程方式获取此信息?有没有可以为我做这个的统计工具?
编辑 - 要清楚,我正在寻找结果集的数量而不是引用表的数量。
答案 0 :(得分:2)
有没有办法以编程方式获取此信息?
简短回答否,在SQL服务器中无法获得proc返回的结果集数量,因为存储过程返回的结果集数量可以是动态的,并且可以取决于传递给存储过程的参数值。
如果收到错误的输入,某些存储过程可能会出错。
考虑到这一点:
在纯TSQL中,无法确定proc返回的结果集的数量,使用the insert exec pattern无法捕获多于1个结果集的方法
您可能会使用SQL CLR对结果集进行计数。 (您必须使用虚拟参数执行proc并回滚tran)
您可以使用C#或任何其他客户端工具编写内容,创建tran,注入虚拟参数,执行,计算结果集并回滚事务。
答案 1 :(得分:0)
:
select result_sets from syscat.procedures where procname='...'
给出估计的返回表数。
答案 2 :(得分:0)
您可以构建一个经典的ADO包装器来调用sprocs并计算返回的记录集的数量(NextRecordSet方法)。迭代它们(如果需要,使用数据字典查询来获取列表)并查看。在没有任何其他合适的工具的情况下,您甚至可以在Excel中使用VBA执行此操作。如果您没有在系统上安装ADO库,请下载并安装适当版本的MDAC。
答案 3 :(得分:0)
我担心的是他要求存储过程返回的表数。如果存储过程返回SQL select语句的结果,则它可能很好地从多个表返回数据。在这种情况下,结果集的数量不等于表的数量。
任何计算存储过程返回的 tables 数量的工具都会非常聪明,因为如果它不想要解析存储过程的代码,它可能需要解析它彻底执行它们。如果存储过程调用函数,或者用.NET语言编写,它会变得更加复杂。
某些数据可能会封装在视图中,这会进一步取消引用数据(甚至可能通过其他视图进一步取消)。并且(因为我们都必须不情愿地承认)一些存储过程写得很糟糕。
编辑:有趣的是,这个答案一直被拒绝。这是在问题首次发布时写的,在他澄清他的问题之前。当时,我的担忧是有效的。我不知道他们是否导致他澄清了他的问题,但这是令人深思的,人们渴望在没有提供评论来证明这一点的情况下给予答案。答案 4 :(得分:0)
致命的缺陷是返回的结果集的数量可以根据存储过程中的逻辑而变化。
如果XXXX BEGIN
选择xxxx
选择xxxx
END
否则
BEGIN
选择xxxx
选择xxxx
选择xxxx
选择xxxx
结束
旁注 - 如果我编写了存储过程,答案将始终为零或一。我从来没有找到一个好的设计模式,从一个查询中实现了多个结果集 - 它不可避免地违反了KISS。
答案 5 :(得分:0)
SET FMTONLY ON
可能会做你需要的。
但是这有一些限制 - 与临时表使用有关(LINQ和SSIS在尝试确定某些SP的用途时遇到的问题)。
请记住,没有100%可靠的方法来确定这一点,因为SP包含的代码可能意味着结果集的数量是任意的(特别是如果他们根据初始主结果执行游标返回从属详细结果集)设定)。