SQL Server查找返回结果集的存储过程

SQL Server查找返回结果集的存储过程,sql,sql-server,sql-server-2008,stored-procedures,information-schema,Sql,Sql Server,Sql Server 2008,Stored Procedures,Information Schema,在SQL Server中,可以声明返回一个或多个结果集的存储过程: CREATE PROCEDURE dbo.proc1 AS SELECT 1 a, 2 b UNION SELECT 3 a, 4 b; 我正在研究如何从SQLServer2008+中的字典视图中检测所有此类存储过程。不幸的是,我似乎无法在以下两种情况中找到识别此类程序的独特标志: 信息模式.例程 系统程序 这里还有一个例子,表明返回结果集的过程和不返回结果集的过程之间的元数据似乎没有区别 是否可以以正式正确的方式完成,而不

在SQL Server中,可以声明返回一个或多个结果集的存储过程:

CREATE PROCEDURE dbo.proc1
AS 
SELECT 1 a, 2 b UNION SELECT 3 a, 4 b;
我正在研究如何从SQLServer2008+中的字典视图中检测所有此类存储过程。不幸的是,我似乎无法在以下两种情况中找到识别此类程序的独特标志:

信息模式.例程 系统程序 这里还有一个例子,表明返回结果集的过程和不返回结果集的过程之间的元数据似乎没有区别


是否可以以正式正确的方式完成,而不寻找任何黑客/诡计?如果是,如何查找?

您可以找到包含select语句的所有存储过程

select distinct 
    o.name,
    o.type_desc
from syscomments c
inner join sys.objects o on
    c.id = o.object_id
where
    [text] like '%select%' and
    type_desc = 'SQL_STORED_PROCEDURE'

但是syscomments表包含所有的过程文本,包括注释。

我认为这是不可能的。在SQL Server中,存储过程可以包含动态SQL,它构造查询或调用其他存储过程,例如返回结果集。但这不仅限于动态SQL,例如,在IF中使用SELECT还将决定存储过程返回0还是1结果集。任何生成的结果集如果不是由存储过程本身处理的,都会返回给用户


因此,存储过程可以返回任意数量的结果计数和结果集。这意味着在编译时create或alter无法确定是否实际生成了结果集以及生成了多少结果集,这可能就是为什么在元数据中找不到这些结果集的原因。

一种可能的解决方案是执行所有存储过程,将结果输出到其他语言(如ruby),然后在其中计算结果集。是的,我知道这一点,但这并不是一个很好的解决方案,因为我甚至不知道执行这些程序会引发什么副作用。我同意这不是一个好的解决方案。对于某些存储过程,还需要知道其中的参数。另一种可能的方法是解析存储过程,但解析存储过程代码并不容易……我认为您是对的。当然,sql server不会返回游标。sql server中的游标是4个字母的单词:我认为这是不可能的;存储过程可以包含动态SQL,它构造对其他存储过程的查询或调用,并返回任意数量的结果计数和游标。这意味着在编译时创建或更改结果集时,不可能确定是否生成结果集以及生成了多少结果集,这是非常模糊的。我的意思是,选择可能真的是插入的一部分。。选择,或更新视图,如更新选择。。设置..,所以这并没有告诉我任何关于潜在匹配的信息…这是有意义的。我经常认为某些数据库的这一特性对应于Oracle所称的ref_游标,但事实并非如此。Oracle参考游标类型是预先定义的。游标是否会从一个过程返回是众所周知的-不像在这种情况下,你确实无法知道。@LukasEder我认为这是可能的,因为TDS,我没有看过整个规范,但我相信它会流式处理表描述符,行**,直到它发出结束信号,这意味着它可以非常灵活地返回什么。是的,我知道这一点。实际上支持通过获取多个结果集,这只是在冗长的循环中运行Statement.getMoreResults和Statement.getResultSet的相关JDBC代码的捷径。我只是没有将这种行为与存储过程确实可以在t-SQL中返回任意数量的结果这一事实联系起来。