Comment mettre à jour une colonne récupérée par un curseur en TSQL

Avant d'aller plus loin: Oui, je sais que les curseurs des résultats médiocres en comparaison avec des opérations à base d'ensemble. Dans ce cas particulier, je suis à court d'un curseur sur une table temporaire de plus de 100 enregistrements, et que la table temporaire sera toujours assez petites, donc la performance est moins crucial que la flexibilité.

Ma difficulté, c'est que je vais avoir du mal à trouver un exemple de la façon de mettre à jour une colonne récupérée par un curseur. Déjà quand j'ai utilisé les curseurs, j'ai récupéré les valeurs dans des variables, puis exécutez une requête de mise à jour à chaque étape, sur la base de ces valeurs. À cette occasion, je souhaite mettre à jour un champ dans la table temporaire, mais je ne peux pas comprendre comment le faire.

Dans l'exemple ci-dessous, je suis en train de mettre à jour le champ CurrentPOs dans la table temporaire #t1, basé sur une requête qui utilise #t1.Product_ID à regarder jusqu'à la valeur requise. Vous verrez dans le code que j'ai tenté d'utiliser la notation curPO.Product_ID de référence, mais il ne fonctionne pas. J'ai également tenté d'utiliser une instruction de mise à jour contre curPO, également sans succès.

Je peux faire le code du travail par l'extraction de variables, mais j'aimerais savoir comment mettre à jour directement le champ.

Je pense que je suis probablement manquer quelque chose d'évident, mais quelqu'un peut-il aider?

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
Ai-je raté quelque chose, ou pourrait le curseur être remplacée par une instruction de mise à JOUR?
J'ai essayé, mais les sections marquées <calcul> ont agrégats eux qui ont causé des complications. Je me souviens qu'il avait à faire avec le fait que j'ai été l'exécution d'une requête d'agrégation sur une autre requête d'agrégation, mais je ne me souviens pas pourquoi ça ne marchait pas, maintenant! Va laisser un autre commentaire, si il vient à l'esprit. Peu importe, je voudrais savoir comment faire cela avec un curseur!
Je me souviens maintenant - l'agrégation imbriquées dans la mise à jour a cessé de venir avec "syntaxe Incorrecte près de ')'." Fondamentalement, il ne serait pas me permettre d'utiliser une requête d'agrégation comme une sous-requête.

OriginalL'auteur Billious | 2009-09-24