如何将循环转换为基于表的查询?

时间:2012-09-24 11:34:11

标签: sql sql-server-2008 set-based

我有一个表IDTable,其中包含一列ID,我还有一个表值函数MyProcedure,它带有一个参数。此参数是我的专栏ID。此函数返回一个表。我需要为列ID中的每个值调用此函数。我有这样的代码:

Declare @ResultTable table(
  ClientID nvarchar(50) null,
  [Date] datetime null,
  Item varchar(100) null
)

Declare @IDTable table(
    id int
 )

 declare @counter as int 
 set @counter = isnull( (select max(id) from @IDTable),0) 
 while @counter<>0 
 begin 
    set @ID = (select id from @IDTable where id=@counter)

    insert into @ResultTable
       select ClientID
              [Date],
              Item
       from MyProcedure (@ID)

    delete from @IBTable where id=@counter 
    set @counter=isnull((select max(id) from @IBTable),0) 
 end

我需要在循环时移除并进行基于集合的替代方案。我该怎么办?

1 个答案:

答案 0 :(得分:0)

您可以使用CROSS APPLY

   insert into @ResultTable
   select   b.ClientID,
            b.[Date],
            b.Item
   from     @IDTable a
   CROSS    APPLY MyProcedure(a.id) b