Подавить вывод хранимой процедуры при вызове другой хранимой процедуры?

Итак, у меня есть sproc1, который что-то делает и возвращает несколько строк. Важно то, что он кое-что делает. У меня также есть sproc2, который выполняет некоторые действия, вызывает sproc1 (который выполняет свои функции) и возвращает свои собственные строки. Проблема в том, что когда я вызываю sproc2, я получаю 2 набора результатов. Первое происходит от sproc1, а второе - от sproc2.

Можно ли легко подавить sproc1 при вызове в sproc2?

Насколько я могу судить, у меня есть два способа сделать это:

  • используйте временную таблицу, чтобы поймать вывод exec sproc.
  • в C# перейдите к последнему набору результатов и используйте его, игнорируя первый (ие).

Ни один из этих методов нельзя использовать повторно, так как:

  • сначала требует от меня CREATE временную таблицу, которая соответствует выходным данным хранимой процедуры.
  • второй требует, чтобы я перебрал наборы результатов, чтобы добраться до последнего, не зная, какой из них последний, если я не попытаюсь перейти к следующему и не смогу выполнить через .NextResult().

Простым способом было бы, если бы SQL Server позволял мне выполнять хранимую процедуру в другой хранимой процедуре, но подавлял бы вывод внутренней выполняющей ее. Или если SqlCommand разрешил ExecuteReader(CommandBehavior.LastResult) и сам перейдет к последнему результату.

Можно ли добиться любого из этих двух способов простым и многократно используемым способом?

Реальным решением было бы преобразовать внутренние хранимые процедуры в компоненты write и read. Или добавьте @param во внутренние хранимые процедуры, чтобы предотвратить выбор окончательных результатов. Но я стараюсь здесь полениться!


person CodeAngry    schedule 13.11.2019    source источник
comment
Добавьте параметр ко второму sp и используйте его в sp2 с if: if not @suppress_results select ....   -  person sepupic    schedule 13.11.2019
comment
Вы можете использовать вариант sepupic или другой вариант, который вы найдете здесь: stackoverflow.com/questions/866484/   -  person droebi    schedule 13.11.2019
comment
Вы уже рассмотрели все доступные варианты, теперь нужно выбрать наименее хлопотное!   -  person EzLo    schedule 13.11.2019
comment
это похоже на проблему XY.   -  person Mitch Wheat    schedule 13.11.2019
comment
@MitchWheat Я знаю проблему, у меня есть решения, но мне было интересно, есть ли какие-то загадочные знания SQLServer, которые мне, вероятно, не нужно справляться с этим проще, чем то, как я уже знаю, как это делать.   -  person CodeAngry    schedule 13.11.2019


Ответы (1)


Итак, (пока, если я не найду лучший ответ или что-то не улучшится) Я закончил тем, что добавил этот аргумент со значением по умолчанию, поэтому мне вообще не нужно думать об этом на стороне C #:

,@_Suppress bit = 0 -- prevent output via select

и прямо перед select я добавляю:

if @_Suppress is null or @_Suppress = 0
select -- output results

Этот метод также требует от вас рефакторинга insert ... output кода и вывода во временную таблицу и, в конечном итоге, выбора только в том случае, если он не подавлен.

Это самый простой способ справиться с проблемами, но в таких случаях должны быть внутренние функции, например:

begin suppress
exec some_sproc;
end suppress;

или какой-то специальный синтаксис, например sexec (как в подавленном exec), или общая таблица NULL, которая может принимать любой формат вставки столбцов и просто отбрасывать его.

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

person CodeAngry    schedule 13.11.2019