在我進一步研究之前:是的,我知道遊標與基於集合的操作相比性能較差。在這種特殊情況下,我在100個左右的臨時表上運行遊標,並且臨時表總是相當小,所以性能不如靈活性。如何在TSQL中更新由光標讀取的列
我的困難是,我無法找到如何更新光標所獲取列的示例。以前,當我使用遊標時,我已經將值檢索到變量中,然後根據這些值在每個步驟中運行更新查詢。在這種情況下,我想更新臨時表中的字段,但我無法弄清楚如何去做。
在下面的示例中,我試圖根據使用#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語句來代替? – 2009-09-24 06:40:06
我試過了,但標記爲的部分在其中有聚集,導致併發症。我記得那是因爲我正在對另一個聚合查詢運行一個聚合查詢,但我不記得它爲什麼現在不起作用了!如果想到它會留下另一個評論。無論如何,我想知道如何用光標做到這一點! –
Billious
2009-09-24 06:48:02
我現在記得 - 更新中的嵌套聚合不斷提出「附近語法不正確」)'。「基本上它不會允許我使用聚合查詢作爲子查詢。 – Billious 2009-09-24 23:02:11