如何取消存储过程中SELECT语句返回的记录集

时间:2018-08-04 15:56:49

标签: sql sql-server stored-procedures

我正在编写一个存储过程,该过程将检查各种数据库中各种表的存在以及执行存储过程的用户对这些表的权限。存储过程本身位于用户数据库内(即不在主数据库中)。

要执行检查,我的存储过程包含许多SELECT语句。这些显然都返回一个记录集。我想以某种方式抑制这些记录集,以使它们不由存储过程返回,而是返回我自己的单个记录集,它只是与存储过程执行的每个检查相关的消息的集合。

我认为显而易见的答案是改为使用表值函数,但是由于它们出现在存储过程中,因此我无法在Function中成功重新创建测试。首先,我不得不使用临时表(在函数中是不可能的)和动态SQL(与表参数不太兼容)。

我认为我基本上有两种选择:

  • 将我的存储过程重写为一个函数,并弄清楚如何以不同的方式进行检查。
  • 继续使用我的存储过程,并使用一个OUTPUT参数返回我的结果消息,可能以分隔字符串的形式返回,并且在关联的ASP.NET应用程序中,只需忽略该存储过程返回的所有记录集即可。
  • li>

这些解决方案都不能令人满意。在我花更多的时间追求任何一个记录之前,是否有办法丢弃存储过程中SELECT语句产生的记录集,并明确定义我希望它返回的记录?

2 个答案:

答案 0 :(得分:2)

嗯,我只能在这里推测...

您是否正在使用类似的

SELECT ...;
IF @@rowcount > 0
BEGIN
  ...
END;

然后,您可以使用类似的方法将其重写

IF EXISTS (SELECT ...)
BEGIN
  ...
END;

DECLARE @variable integer;
SELECT @variable = count(*) ...;
IF @variable > 0
BEGIN
  ...
END;

一般来说,将查询结果指向目标(变量,表,表达式等),然后它们就不会输出。

然后最后执行查询以获取所需结果。

答案 1 :(得分:1)

我认为,这里几乎没有理由让存储过程产生记录集。那就是存储函数的目的。有时由于使用动态SQL或其他存储过程而需要它,但并非一般做法。我经常看到存储过程在存储功能或视图更合适的地方使用。

您应该怎么做?甚至存储过程中的SELECT语句也应该是以下之一:

  • 设置(本地)变量。
  • 将结果保存在临时表或表变量中。

存储过程的逻辑应在局部变量上起作用。应该使用OUTPUT参数返回结果。

如果需要以表格格式返回行,则可以显式地使用表(例如全局临时表或实表)来执行此操作。或者,您可以在末尾有一个SELECT,但确实会返回一个结果集。但是,如果您需要这样做并且可以将存储过程作为函数使用,那么我认为更好。