-2

我在这里有一个查询,用每个代表的最新库存的库存类型更新表格。但是,我让它工作的唯一方法是使用游标,这确实会影响性能。下面是我正在使用的表声明和查询。我还能做些什么来更快地达到预期的结果吗?

桌子:

create table #inv (
Rep_LName nvarchar (50),
Rep_FName nvarchar (50),
Rep_ID nvarchar (50),
Rep_Email nvarchar (100),
Rep_Status nvarchar (50),
Rep_BU nvarchar (50),
Sales_Force nvarchar (50),
Territory nvarchar (50),
Sample_Eligibility nvarchar (50),
DM_Name nvarchar (100),
Phys_Inv_Date datetime,
Last_Reconciled datetime,
Inv_Type nvarchar(50),
Days_Since_Last_inv int)

询问:

declare Inventory_type cursor 
for select rep_ID, inventory_type
from  inv_header
where rep_id in (select rep_id from #inv)
order by call_date desc
declare @rep_ID nvarchar(50)
declare @inventory_type nvarchar(50)
declare @ls_Sql as nvarchar(max)
declare @param as nvarchar(max)
select @ls_Sql=''
select @param=''
-- open cursor
open Inventory_type

fetch next from Inventory_type 
into @rep_ID, @inventory_type
while (@@fetch_status = 0)
begin   
    --use parameterized dynamic sql
    SET @param='@rep_ID nvarchar(50),@inventory_type nvarchar(50)'
    SET @ls_Sql='update #inv set Inv_Type = @inventory_type 
WHERE rep_id = @rep_id AND Inv_Type IS NULL'

    --pass parameter to dynamic query
    exec sp_executesql @ls_Sql,@param,@rep_ID,@Inventory_type

    fetch next from Inventory_type 
    into @rep_ID, @Inventory_type
end

close Inventory_type
deallocate Inventory_type
4

4 回答 4

4

不要使用游标;它们会破坏查询性能。是的,它们出现在产品中是有原因的,但它们是最后的工具,几乎总是可以使用基于集合的方法完成工作。一个简单的更新语句在这里就可以正常工作。

update i 
set i.Inv_Type = h.inventory_type 
from #inv i
inner join inv_header h on i.rep_id = h.rep_id
   and h.Call_date =
   (select Max(Call_Date) 
    from inv_header i2
    where i2.rep_id = i.rep_id)
where i.inv_type is null
于 2013-05-10T13:25:33.547 回答
1

试试这个:

  update i set 
  Inv_Type = h.inventory_type 
  From #inv i join inv_header h 
     on h.rep_id = i.Rep_ID 
        And h.Call_date =
            (Select Max(Call_Date) 
             From inv_header
             Where rep_id = i.rep_id)
  where i.Inv_Type Is Null
于 2013-05-10T13:31:40.553 回答
0

在我的脑海中,并且不知道您的数据库,这样的事情应该可以工作:

UPDATE #inv set Inv_Type = (SELECT inventory_type FROM inv_header
    WHERE #inv.Rep_ID = inv_header.rep_id)
    WHERE Inv_Type IS NULL

您也可以将其作为连接进行,根据您拥有的行数可能会更有效。

至少应该让你开始......

于 2013-05-10T13:23:03.217 回答
0

我认为他想要具有最新通话日期的 inv_type ..

update inv
set inv.Inv_Type = ih.inventory_type
from (
    select rep_ID, max(call_date) max_call_date
    from  inv_header
    where rep_id in (select rep_id from #inv)
    group by rep_ID ) a
inner join inv_header ih 
    on ih.rep_ID = a.rep_ID
    and ih.call_date = a.max_call_date
inner join #inv inv 
    on inv.rep_ID = ih.rep_id
    and inv.Inv_Type is null
于 2013-05-10T13:26:32.297 回答