2011-01-30 4 views
0

У меня есть таблица для "Departments" (ID,deptID)Как запустить хранимую процедуру в цикле

ID parentdeptID 
2 null 
3 null 
7 2 
8 2 
9 3 

и вторая таблица "Filter" содержит идентификаторы только

ID 
2 
9 

и хранимую процедуру только с входом prameter @deptID и выход является результатом объединения некоторых таблиц в зависимости от ввода ID

мой вопрос: прочитайте ли вы из таблицы «Filt эр»и получают идентификаторы, и для каждого идентификатора получить свои Чайлдс, если он имеет
в нашем примере:

2,7,8,9 (2,9 from "Filter" and 7,8 from "Departments" as childs of 2)

, а затем для каждого из этих 4 идентификаторов преобразования приложений хранимой процедуры ID

Это обзор, если у кого-то есть лучший способ без использования хранимой процедуры. Он приветствуется.

+0

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

+0

Дорогой «Марк Байерс», спасибо за отзыв, я отредактировал свой вопрос, надеюсь, теперь ясно, что сейчас – RMohammed

ответ

2

Я не уверен, что я хорошо понимаю вашу модель, но вот как вы можете сделать цикл и выполнить хранимую процедуру внутри это:

Редактировать Я думаю, что теперь я понимаю ваш вопрос немного лучше.

declare @filterId int 
declare @deptId int 

select @filterId = min(ID) from Filter 
while @filterId is not null 
    begin 
     -- run the stored procedure for the main filter ID 
     exec procedureName @filterId 

     -- run the SP for the related IDs in Department table 
     select @deptId = min(ID) from Departments where parentdeptID = @filterID 
     while @deptId is not null 
     begin 
      exec procedureName @deptId 
      select @deptId = min(ID) from Departments where ID > @deptId and parentdeptID = @filterID 
     end 

     select @filterId = ID from Filter where ID > @filterId 
    end 

Надеюсь, вам это поможет.

+0

спасибо macca1 за ваш интерес. – RMohammed

1

Чтобы сделать то, что вы хотите без хранимой процедуры, вы должны присоединиться к DeptID с запросом внутри хранимой процедуры.

Предположим, что ваш SP делает select DeptID, DeptInfo from @SomeOtherTableWithData where DeptiID = @DeptID.

Вот пример кода с вашими таблицами, который вместо заменяет хранимую процедуру на соединение.

-- Setup sample data 
declare @Departments table (DeptID int, ParentDeptID int) 
declare @Filter table (DeptID int) 
declare @SomeOtherTableWithData table (DeptID int, DeptInfo varchar(50)) 

insert into @Departments values (2, null) 
insert into @Departments values (3, null) 
insert into @Departments values (7, 2) 
insert into @Departments values (8, 2) 
insert into @Departments values (9, 3) 

insert into @Filter values(2) 
insert into @Filter values(9) 

insert into @SomeOtherTableWithData values (2, 'Info DeptID 2') 
insert into @SomeOtherTableWithData values (3, 'Info DeptID 3') 
insert into @SomeOtherTableWithData values (7, 'Info DeptID 7') 
insert into @SomeOtherTableWithData values (8, 'Info DeptID 8') 
insert into @SomeOtherTableWithData values (9, 'Info DeptID 9') 

-- Get the DeptID's into temporary table #DeptIDs 
select D.DeptID -- Parents 
into #DeptIDs 
from @Departments as D 
    inner join @Filter as F 
     on D.DeptID = F.DeptID 
union 
select D.DeptID -- Children 
from @Departments as D 
    inner join @Filter as F 
     on D.ParentDeptID = F.DeptID 

-- Use #DeptID in a join with the query in the stored procedure 
select S.DeptID, S.DeptInfo 
from #DeptIds as D 
    inner join @SomeOtherTableWithData as S 
     on D.DeptID = S.DeptID 

-- Drop the temporary table 
drop table #DeptIDs 

В результате

DeptID DeptInfo 
2 Info DeptID 2 
7 Info DeptID 7 
8 Info DeptID 8 
9 Info DeptID 9 

Вы можете использовать подзапрос вместо временной таблицы, если вы хотите только один SQL заявление.

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