2008-09-17 1 views
2

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

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

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

ответ

0

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

1

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

3

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

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

1

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

+0

На самом деле я не думаю, что это хорошая идея. Поскольку возвращаемое значение имеет тип int, и вы не можете передать с ним bigint.Поэтому, если у вас есть таблица с миллионами записей с первичным ключом bigint, ваше решение может быть подвержено риску, и оно просто не работает. Кроме того, я должен сказать, что определение возвращаемого значения в sql - это просто сообщить результат операции и ничего другого (например, перечисления на C# всегда должны иметь определенные значения). Вероятно, лучше использовать выходные параметры для выполнения такой вещи или, как сказал наш друг, использовать переменную @@ RowCount. Cheers – Rikki 2012-10-09 16:42:21

0

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

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

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

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

Учитывая, что вы на самом деле не нужно знать количество, просто есть ли или нет данных для 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 

Теперь вы можете выполнить 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

-1 Потому что тип данных «TinyInt» не является хорошим выбором для подсчета записей в базе данных, особенно когда вы работаете над некоторыми большими данными. Очень ясно, что вы не знаете, насколько большой будет база данных в будущем, пока ваше программное обеспечение работает до и после этого. Полное решение должно работать всегда, а не исключительно. Поэтому я думаю, вы должны изменить тип данных. Приветствия. – Rikki 2012-10-09 16:52:15

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 
; 

Приветствия

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 
Смежные вопросы