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
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
Vous devez vous connecter pour publier un commentaire.
Après avoir fait un peu plus d'une recherche sur google, j'ai trouvé une solution partielle. Le code de mise à jour est comme suit:
J'ai toujours eu à l'utiliser
FETCH INTO
, cependant, pour récupérer#t1.Product_ID
et exécuter la requête qui produit #POs, alors j'aimerais quand même savoir si il est possible d'utiliserFETCH
sur son propre.Merci pour cette - oui, fondamentalement, c'est ce que j'ai compris. OÙ était le peu de syntaxe que je n'avais pas trouvé dans le MS de la documentation, si je suis sûr qu'il est là quelque part.
OriginalL'auteur Billious
Est-ce que vous souhaitez?
Son commentaire sur la question elle-même prétend qu'il ne pouvait pas le faire fonctionner. Allez-y!
Je n'ai pas essayé cette version, mais on dirait qu'il va avoir le même problème que j'ai décrit ci-dessus. Je suis en train de faire référence à un champ dans le curseur de la ligne à l'aide de "curPO.Produit_id", cependant il renvoie "La partie multi-identificateur 'curPO.Product_ID " ne peut pas être lié." Évidemment, je suis en utilisant la mauvaise syntaxe. Est-il possible de faire référence à un champ dans le courant du curseur de la ligne de cette façon? Ou avez-vous d'utiliser FETCH?
OriginalL'auteur Jeremy Stein
Peut-être vous avez besoin de quelque chose comme ça:
OriginalL'auteur Pavel Kovalev