小编典典

如何在TSQL中更新由游标获取的列

sql

在继续之前:是的,我知道与基于集合的操作相比,游标的性能较差。在这种特殊情况下,我正在100个左右的临时表上运行游标,并且该临时表将始终很小,因此性能的重要性不如灵活性。

我的困难在于,我无法找到有关如何更新由游标获取的列的示例。以前,当我使用游标时,我已将值检索到变量中,然后根据这些值在每个步骤中运行更新查询。在这种情况下,我想更新临时表中的字段,但是我不知道该怎么做。

在下面的示例中,我试图基于#t1.Product_ID用于查找所需值的查询来更新临时表#t1中的CurrentPOs字段。您将在代码中看到我尝试使用该符号curPO.Product_ID来引用此符号的方法,但是它不起作用。我也曾尝试对curPO使用update语句,但也未成功。

我可以通过获取变量来使代码工作,但我想知道如何直接更新该字段。

我想我可能缺少明显的东西,但是有人可以帮忙吗?

declare curPO cursor
for select Product_ID, CurrentPOs from #t1
for update of CurrentPOs
open curPO

fetch next from curPO

while @@fetch_status = 0
begin
    select      OrderQuantity = <calculation>,
                ReceiveQuantity = <calculation>
    into        #POs
    from        PurchaseOrderLine POL 
    inner join  SupplierAddress SA ON POL.Supplier_ID = SA.Supplier_ID
    inner join  PurchaseOrderHeader POH ON POH.PurchaseOrder_ID = POL.PurchaseOrder_ID
    where       Product_ID = curPO.Product_ID
    and         SA.AddressType = '1801'

    update curPO set CurrentPOs = (select sum(OrderQuantity) - sum(ReceiveQuantity) from #POs)

    drop table #POs

    fetch next from curPO
end

close curPO
deallocate curPO

阅读 226

收藏
2021-05-23

共1个答案

小编典典

经过更多的谷歌搜索后,我找到了部分解决方案。更新代码如下:

UPDATE #T1 
SET    CURRENTPOS = (SELECT SUM(ORDERQUANTITY) - SUM(RECEIVEQUANTITY) 
                     FROM   #POS) 
WHERE  CURRENT OF CURPO

FETCH INTO但是,我仍然必须使用来检索#t1.Product_ID和运行生成#PO的查询,因此我仍然想知道是否可以单独使用FETCH

2021-05-23