2

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

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

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

4

9 回答 9

3

好吧,根据存储过程的工作方式,@@ROWCOUNT 返回 SP 将执行的任何操作(包括更新)的结果数:http: //msdn.microsoft.com/en-us/library/ms187316.aspx

这仅在您在 sp 中执行的最后一件事是将行返回给客户端时才有效……否则您将获得其他语句的结果。说得通?

于 2008-09-17T04:06:08.627 回答
1

@@ROWCOUNT

于 2008-09-17T04:05:01.203 回答
1

使用输出参数

于 2008-09-17T04:06:00.250 回答
1

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

于 2008-09-17T04:30:42.187 回答
0

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

于 2008-09-17T04:05:23.357 回答
0

似乎是其他人更改了其他存储过程,无论对此类过程进行更改,您都需要一些东西来有效地检查结果。

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

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

片段:

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

INSERT @res 
EXEC dbo.ProcFoo

SELECT COUNT(*) FROM @res
于 2008-09-17T05:01:05.297 回答
0

我认为你应该这样做:

Create  Procedure   [dbo].[GetResult]   (
    @RowCount   BigInt  =   -1  Output
)   As  Begin

    /*
        You can do whatever else you should do here.
    */

    Select  @RowCount   =   Count_Big(*)
        From    dbo.SomeLargeOrSmallTable
        Where   SomeColumn  =   'Somefilters'
        ;

    /*
        You can do whatever else you should do here.
    */

    --Reporting how your procedure has done the statements. It's just a sample to show you how to work with the procedures. There are many ways for doing these things.
    Return  @@Error;

End;

写完之后,你可以得到这样的输出结果:

Declare @RowCount   BigInt
,   @Result     Int
;

Execute @Result =   [dbo].[GetResult]   @RowCount   Out

Select  @RowCount
,   @Result
;

干杯

于 2012-10-09T17:01:08.310 回答
0

鉴于您实际上并不需要知道计数,而只需要知道您的 sproc 是否有数据,我建议您这样做:

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

现在您可以执行存储过程并检查@Param3 的值:

DECLARE @ThereWasData tinyint
exec subProcedure 'foo', 'bar', @ThereWasData OUTPUT
IF @ThereWasData = 1 
  PRINT 'subProcedure had data'
ELSE
  PRINT 'subProcedure had NO data'
于 2008-09-17T12:30:53.873 回答
0
  create proc test
    as
    begin
     select top 10 * from customers
    end
    go


    create proc test2 (@n int out)
    as
    begin
    exec test
    set @n = @@rowcount
    --print @n
    end
    go

    declare @n1 int =0

    exec test2 @n1 out
    print @n1
    --output result: 10
于 2016-09-01T22:52:39.930 回答