从另一个存储过程中对一个存储过程的结果进行计数的最有效方法是什么?

时间:2020-03-05 18:57:53  来源:igfitidea点击:

在一个存储过程中,我需要获取另一个存储过程的结果计数。具体来说,我需要知道它是否返回任何结果,或者是否为空集。

我可以创建一个临时表/表变量,在其中执行存储过程,然后对该数据进行选择计数。但是我真的不在乎数据本身,我只需要计数(或者数据存在/不存在)即可。我想知道是否有更有效的方法来获取这些信息。

我不想只复制其他存储过程的内容并将其重写为选择计数。存储过程更改太频繁,以至于无法运行。

解决方案

回答

@@ ROWCOUNT

回答

如果我们可以将其他过程重写为返回结果集的简单函数,则只需从中选择count(*)。

回答

使用out参数

回答

好了,根据存储过程的工作方式,@@ ROWCOUNT返回SP所做的任何事情(包括更新)的结果:
http://msdn.microsoft.com/en-us/library/ms187316.aspx

仅当我们在sp中做的最后一件事是将行返回给客户端时,这才起作用...否则,我们将获得其他语句的结果。有道理?

回答

我认为我们可以返回行数(使用RETURN)或者使用out参数来获取值。

回答

似乎是其他人正在更改其他存储过程,并且无论该过程的更改如何,我们都需要有效地检查结果的方法。

创建一个诱惑表,并将该过程的结果插入其中。

然后,我们可以对结果进行行计数。如果我正确理解问题,它不是最有效但最可靠的解决方案。

片段:

DECLARE @res AS TABLE (
    [EmpID] [int] NOT NULL,
    [EmpName] [varchar](30) NULL,
    [MgrID] [int] NULL
)

INSERT @res 
EXEC dbo.ProcFoo

SELECT COUNT(*) FROM @res

回答

鉴于我们实际上并不需要知道计数,仅需要知道存储过程中是否有数据,我就建议这样的事情:

CREATE PROCEDURE subProcedure @param1, @param2, @Param3 tinyint OUTPUT
AS
BEGIN
  IF EXISTS(SELECT * FROM table1 WHERE we have something to work with)
   BEGIN
    -- The body of your sproc
    SET @Param3 = 1
   END
  ELSE
   SET @Param3 = 0
END

现在,我们可以执行sproc并检查@ Param3的值:

DECLARE @ThereWasData tinyint
exec subProcedure 'foo', 'bar', @ThereWasData OUTPUT
IF @ThereWasData = 1 
  PRINT 'subProcedure had data'
ELSE
  PRINT 'subProcedure had NO data'