2009-09-24 47 views
4

在我進一步研究之前:是的,我知道遊標與基於集合的操作相比性能較差。在這種特殊情況下,我在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 
+0

我失去了一些東西,或者可以在光標UPDATE語句來代替? – 2009-09-24 06:40:06

+0

我試過了,但標記爲的部分在其中有聚集,導致併發症。我記得那是因爲我正在對另一個聚合查詢運行一個聚合查詢,但我不記得它爲什麼現在不起作用了!如果想到它會留下另一個評論。無論如何,我想知道如何用光標做到這一點! – Billious 2009-09-24 06:48:02

+0

我現在記得 - 更新中的嵌套聚合不斷提出「附近語法不正確」)'。「基本上它不會允許我使用聚合查詢作爲子查詢。 – Billious 2009-09-24 23:02:11

回答

10

做多一點的谷歌搜索後,我找到了部分解決方案。更新代碼如下:

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

我仍不得不使用FETCH INTO,然而,檢​​索#t1.Product_ID和運行產生#POs查詢,所以我還是想知道它是否可以使用FETCH上它自己的。

+1

更新表中的值是通過表上的更新語句完成的。 WHERE CURRENT OF cursor將允許使用遊標狀態進行更新,而不是查找正確的行,如更新... where key = @key。 – 2009-09-24 18:41:27

+0

謝謝你 - 是的,基本上這就是我想到的。 WHERE CURRENT OF是我在MS文檔中沒有找到的語法位,儘管我確定它在某處。 – Billious 2009-09-24 23:03:44

0

這是你想要的嗎?

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 
+0

有更多的工作,光標選擇可以包含在更新本身,消除這個可怕的循環 – 2009-09-24 18:17:03

+0

他對這個問題的評論本身聲稱他不能使它工作。去吧! – 2009-09-24 18:56:44

+0

我還沒有試過這個版本,但它看起來會有我上面描述的相同的問題。我試圖使用「curpo.Product_ID」來引用遊標行中的一個字段,但是它返回「無法綁定多部分標識符'curpo.Product_ID'。」很明顯,我使用了錯誤的語法。這樣就可以用這種方式引用當前遊標行中的一個字段嗎?或者你必須使用FETCH INTO? – Billious 2009-09-24 23:08:06

0

也許你需要類似的東西:

update DataBaseName..TableName 
set ColumnName = value 
where current of your_cursor_name;