Как подавить результаты хранимой процедуры из хранимой процедуры? - PullRequest
20 голосов
/ 21 февраля 2009

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

Ответы [ 3 ]

32 голосов
/ 21 февраля 2009

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

/* Assume this table matches the output of your procedure */
DECLARE @tmpNewValue TABLE (newvalue int)
INSERT INTO @tmpNewValue 
EXEC ProcedureB
1 голос
/ 23 февраля 2009

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

0 голосов
/ 29 марта 2012

Вот легкая модификация 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. При вероятности, что другой вызывающий proc уже создаст временную таблицу с именем #__suppress_results перед вызовом proc B, просто используйте другое имя как #__@supress_results.

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

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