在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,表明返回结果集的程序和未返回结果集的程序之间的元数据似乎没有区别。
可以以正式的方式完成(不寻找任何黑客/技巧)吗?如果是这样,怎么样?
答案 0 :(得分:1)
我认为不可能。在SQL Server中,存储过程可以包含构造查询的动态SQL(或调用其他存储过程 - 例如 - 返回结果集)。这不仅限于动态SQL,例如在SELECT
中具有IF
也将决定存储过程是返回0还是1结果集。任何未由存储过程本身处理的生成结果集都将返回给用户。
因此,存储过程可以返回任意数量的结果(计数和结果集)。这意味着在编译时(创建或更改),无法确定是否(以及多少)实际生成了结果集,这可能是您无法在元数据中找到它的原因。
答案 1 :(得分:0)
您可以找到包含带
的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表包含所有过程文本,包括注释。