Ответ 1
Вы можете попробовать что-то вроде этого:
/* Assume this table matches the output of your procedure */
DECLARE @tmpNewValue TABLE (newvalue int)
INSERT INTO @tmpNewValue
EXEC ProcedureB
У меня есть хранимая процедура (мы будем называть ее 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, потому что он работает и сложнее, чем я хочу общаться.
Вы можете попробовать что-то вроде этого:
/* Assume this table matches the output of your procedure */
DECLARE @tmpNewValue TABLE (newvalue int)
INSERT INTO @tmpNewValue
EXEC ProcedureB
Действительно ли я действительно тупой, но не должен "делать какие-то интересные вещи" в другой процедуре? Затем процедура A вызовет процедуру C (которая только делает "Делает некоторые интересные вещи" ), а затем выполнит требуемый выбор, и процедура B также может вызывать процедуру C и делать ее выбор, вместо того, чтобы иметь накладные расходы на вторую выборку и временную таблицу который используется только как мусорный ящик?
Здесь легкая модификация 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.