2009-06-26 2 views
1

Вот проблема, которая у меня есть с хранимой процедурой (с использованием SQL Server 2005), внутри этой хранимой процедуры она вызывает другую хранимую процедуру, помещая данные в временную таблицу.Проблема с хранимой процедурой SQL Server, вызывающая другую хранимую процедуру

INSERT INTO #tmpTable (Column1, Column2, Column3) 
EXEC psp_rptInsideStoredprocedure 2 

Эта встроенная хранимая процедура имеет параметр режима, который определяет, какие столбцы будут переданы. В этом режиме (Mode2) только 3 столбца теряются, когда эта внутренняя хранимая процедура используется для другого отчета (Mode1). 4 столбца теряются. Иногда родительская хранимая процедура жалуется на попытку вставить 4 столбца, а иногда и нет.

Я знаю, что он всегда проходит в режиме 2, но это похоже на то, что SQL Server знает, что иногда эта хранимая процедура возвращает 4 столбца.

Любые мысли о решении?

Благодаря

Дон

+0

Проводка источника «Внутри» может помочь. –

+0

Отбрасывается ли временная таблица между вызовами на одном сеансе? –

ответ

0

Daisy цепочки хранимые процедуры, как правило, не отличная идея. Я бы удалил вызов sproc и напечатал t-sql для того, что вам нужно. Если вы действительно набрали еще один sproc. Создайте новый sproc, который делает именно то, что вам нужно для этой ситуации.

Это все о Single Responsibility Principle

+4

Затем снова - разделив код на два отдельных SProcs, возможно, просто из-за SRP! –

+1

Я не согласен. Создание целевых отдельных sprocs, которые делают одну конкретную вещь, - это именно то, что касается SRP. –

3

сделать процедуру ребенок всегда возвращает тот же номер и тип столбцов, использовать NULL, если это необходимо. Если результаты для обеих версий настолько разные, что вы не можете их объединить, вам следует рассмотреть возможность создания двух разных процедур.

Я просто угадываю вашу процедуру, но вы можете создать временную таблицу #ResultSet и заполнить ее на основе вашего параметра типа, но всегда возвращать все столбцы и т. Д. Если вы возвращаете много строк, это становится плохо, поскольку временная таблица является накладными. в этом случае, просто убедитесь, что ваши наборы результатов возвращать одинаковое количество столбцов:

IF @version=1 
BEGIN 
    SELECT col1, col2, NULL FROM ... WHERE ... 
END 
ELSE 
BEGIN 
    SELECT col1, col2, col3 FROM ... WHERE ... 
END 

Тогда, когда оба родителя называют его, принять все столбцы, но они могут игнорировать то, что они не нужны.

Смежные вопросы