Подтвердить что ты не робот

Как подавить результаты хранимой процедуры из хранимой процедуры?

У меня есть хранимая процедура (мы будем называть ее A), которая вызывает другую хранимую процедуру (мы будем называть это B). B включает SELECT, который я не хочу отправлять обратно вызывающему абоненту A.

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

PROCEDURE A
    CURSOR
        CALL B -- I WANT TO SUPPRESS THE RESULTS FROM B
    END
    SELECT *
END
PROCEDURE B
    Do some interesting things
    SELECT *
END

Как вы можете видеть выше, A вызывает B и B делает некоторые вещи, которые я хочу, и возвращает результаты, которые мне не нужны. После завершения A он возвращает свой собственный набор результатов.

Как подавить результаты из B в A? Я использую SQL Server 2005. Я бы предпочел не вносить изменения в B, потому что он работает и сложнее, чем я хочу общаться.

4b9b3361

Ответ 1

Вы можете попробовать что-то вроде этого:

/* Assume this table matches the output of your procedure */
DECLARE @tmpNewValue TABLE (newvalue int)
INSERT INTO @tmpNewValue 
EXEC ProcedureB

Ответ 2

Действительно ли я действительно тупой, но не должен "делать какие-то интересные вещи" в другой процедуре? Затем процедура A вызовет процедуру C (которая только делает "Делает некоторые интересные вещи" ), а затем выполнит требуемый выбор, и процедура B также может вызывать процедуру C и делать ее выбор, вместо того, чтобы иметь накладные расходы на вторую выборку и временную таблицу который используется только как мусорный ящик?

Ответ 3

Здесь легкая модификация proc A и B, которая подойдет вашим потребностям:

PROCEDURE A
    CURSOR
        CREATE TABLE #__suppress_results (col1 int)
        CALL B -- I WANT TO SUPPRESS THE RESULTS FROM B
    END
    SELECT *
END
PROCEDURE B
    Do some interesting things
    IF OBJECT_ID('tempdb..#__suppress_results') IS NULL BEGIN
      SELECT *
    END
END

Это позволяет избежать проблемы вложенных INSERT...EXEC и сохраняет существующее поведение proc B. В случае, если какой-либо другой вызывающий процесс уже создает временную таблицу с именем #__suppress_results перед вызовом proc B, просто используйте другое имя, например #[email protected]_results.

И он работает, потому что #__suppress_results отображается внутри proc B, если proc proc вызывается из proc A.