Как запустить хранимую процедуру в цикле - PullRequest
0 голосов
/ 30 января 2011

У меня есть таблица для "Departments" (ID,deptID)

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

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

ID  
2  
9  

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 30 января 2011

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

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

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

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

1 голос
/ 30 января 2011

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

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