【问题标题】:SQL Server find stored procedures that return result setsSQL Server 查找返回结果集的存储过程
【发布时间】:2014-12-07 16:39:54
【问题描述】:

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

CREATE PROCEDURE dbo.proc1
AS 
SELECT 1 a, 2 b UNION SELECT 3 a, 4 b;

我正在考虑尝试从 SQL Server 2008+ 中的字典视图中检测所有此类存储过程。不幸的是,我似乎无法在任何一个中找到识别此类程序的独特标志:

  • INFORMATION_SCHEMA.ROUTINES
  • sys.procedures

这里还有一个SQLFiddle,表明返回结果集的过程和不返回结果集的过程之间的元数据似乎没有区别。

可以以正式正确的方式完成(不寻找任何黑客/技巧)吗?如果有,怎么做?

【问题讨论】:

  • 一种可能的解决方案是执行所有存储过程,将结果输出为其他语言,如ruby,并在那里计算结果集。
  • 是的,我知道这一点,但这并不是一个很好的解决方案,因为我什至不知道执行这些程序会引发什么副作用。
  • 我同意这不是一个好的解决方案。对于一些存储过程,你还需要知道那里的参数。另一种可能的方式是解析存储过程,但是解析存储过程代码并不容易……
  • 我认为你是对的。当然 sql server 不返回游标。 sql server 中的游标是 4 个字母的单词。 :D
  • 我认为不可能;存储过程可以包含构造查询(或调用其他存储过程)并返回任意数量的结果(计数和游标)的动态 SQL。这意味着在编译时(创建或更改)无法确定是否(以及生成了多少)结果集。

标签: sql sql-server sql-server-2008 stored-procedures information-schema


【解决方案1】:

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

因此,存储过程可以返回任意数量的结果(计数和结果集)。这意味着在编译时(创建或更改)无法确定是否(以及有多少)实际生成了结果集,这可能是您无法在元数据中找到它的原因。

【讨论】:

  • 这是有道理的。我经常认为某些数据库的这个特性对应于 Oracle 所说的 ref_cursor,但事实并非如此。 Oracleref_cursor 类型是预先定义好的。游标是否会从过程中返回是众所周知的——不像在这种情况下,您确实根本无法知道。
  • @LukasEder 我认为这是可能的,因为 TDS,我没有查看整个规范,但我相信它会流式传输 (table descriptor, (rows)*)* 直到它发出结束信号,这意味着它非常灵活它可以返回什么。
  • 是的,我知道这一点。 jOOQ 实际上支持通过ResultQuery.fetchMany() 获取多个结果集,这只是在乏味循环中运行Statement.getMoreResults() 和Statement.getResultSet() 的相关JDBC 代码的捷径。我只是没有将这种行为与存储过程确实可以在 T-SQL 中返回任意数量的结果这一事实联系起来。
【解决方案2】:

你可以找到所有包含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'

但是 syscmets 表包括所有过程文本,包括 cmets。

【讨论】:

  • 那很模糊。我的意思是,SELECT 真的可以是INSERT .. SELECT 的一部分,或者是视图的更新,例如UPDATE (SELECT ..) SET ..,所以这并不能真正告诉我任何关于潜在匹配的信息...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-09
  • 1970-01-01
  • 2012-01-15
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多