如何更新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;
