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

在我继续之前:是的,我知道游标与基于集合的操作相比表现不佳。 在这种特殊情况下,我在100个左右的记录的临时表上运行游标,并且临时表总是相当小,因此性能不如灵活性。

我的困难是,我无法找到如何更新由游标读取的列的示例。 以前,当我使用游标时,我已经将值检索到变量中,然后根据这些值在每一步中运行更新查询。 在这种情况下,我想更新临时表中的字段,但我无法弄清楚如何去做。

在下面的示例中,我试图根据使用#t1.Product_ID查询所需值的查询来更新临时表#t1中的字段CurrentPOs。 您将在代码中看到我试图使用记号curPO.Product_ID来引用它,但它不起作用。 我也尝试使用针对curpo的更新声明,但也未成功。

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

我想我可能错过了一些明显的东西,但任何人都可以帮忙吗?

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

在做了更多的搜索之后,我找到了一个部分解决方案。 更新代码如下:

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

然而,我仍然必须使用FETCH INTO来检索#t1.Product_ID并运行产生#PO的查询,所以我仍然想知道是否可以自行使用FETCH


这是你想要的吗?

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
    update curPO set CurrentPOs =
      (select      sum(<OrderQuantityCalculation>)
       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') -
      (select      sum(<ReceiveQuantityCalculation>)
       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')

    fetch next from curPO
end

close curPO
deallocate curPO

也许你需要这样的东西:

update DataBaseName..TableName
set ColumnName = value
where current of your_cursor_name;
链接地址: http://www.djcxy.com/p/94243.html

上一篇: How to update a column fetched by a cursor in TSQL

下一篇: MySQL select where column is not empty