Каков наиболее эффективный способ подсчета результатов хранимой процедуры из другой хранимой процедуры? - PullRequest
2 голосов
/ 17 сентября 2008

В хранимой процедуре мне нужно получить счетчик результатов другой хранимой процедуры. В частности, мне нужно знать, возвращает ли он какие-либо результаты или пустой набор.

Я мог бы создать временную таблицу / переменную таблицы, выполнить хранимую процедуру в ней, а затем запустить счетчик выбора для этих данных. Но я действительно не забочусь о самих данных, все, что мне нужно, это количество (или наличие / отсутствие данных). Мне было интересно, есть ли более эффективный способ получить именно эту информацию.

Я не хочу просто копировать содержимое другой хранимой процедуры и перезаписывать ее как счетчик выбора. Хранимая процедура меняется слишком часто, чтобы это работало.

Ответы [ 9 ]

3 голосов
/ 17 сентября 2008

Ну, в зависимости от того, как работают хранимые процедуры, @@ ROWCOUNT возвращает количество результатов для ЛЮБОГО, что сделает SP (включая обновления): http://msdn.microsoft.com/en-us/library/ms187316.aspx

Это будет работать только в том случае, если последнее, что вы делаете в sp, возвращает строки клиенту ... В противном случае вы получите результаты какого-то другого оператора. Имеет смысл?

1 голос
/ 17 сентября 2008

Я думаю, вы могли бы вернуть количество строк (используя RETURN) или использовать параметр out для получения значения.

1 голос
/ 17 сентября 2008

используйте выходной параметр

1 голос
/ 17 сентября 2008

@@ ROWCOUNT

0 голосов
/ 02 сентября 2016
  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
0 голосов
/ 09 октября 2012

Я думаю, вы должны сделать что-то вроде этого:

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
;

Приветствия

0 голосов
/ 17 сентября 2008

Учитывая, что вам на самом деле не нужно знать количество, просто есть данные для вашего спрока или нет, я бы порекомендовал что-то вроде этого:

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'
0 голосов
/ 17 сентября 2008

Кажется, что кто-то другой изменяет другую хранимую процедуру, и вам нужно что-то, чтобы эффективно проверить результаты независимо от изменений в такой процедуре.

Создайте таблицу tempt и вставьте в нее результат этой процедуры.

Затем вы можете выполнить подсчет строк по результатам. Это не самое эффективное, но самое надежное решение, если я правильно понимаю вашу проблему.

Snipet:

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

INSERT @res 
EXEC dbo.ProcFoo

SELECT COUNT(*) FROM @res
0 голосов
/ 17 сентября 2008

Если вы можете переписать другую процедуру, чтобы она была простой функцией, возвращающей набор результатов, вы можете просто выбрать из нее count (*).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...