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