Je travaille sur une procédure qui mettra à jour un grand nombre d'éléments sur un serveur distant, en utilisant des enregistrements d'une base de données locale. Voici le pseudo-code.Transactions en boucle dans la procédure stockée
CREATE PROCEDURE UpdateRemoteServer
pre-processing
get cursor with ID's of records to be updated
while on cursor
process the item
Peu importe combien nous optimisons, la routine va prendre un certain temps, donc nous ne voulons pas la chose à traiter comme une seule transaction. Les éléments sont marqués après avoir été traités, il devrait donc être possible de reprendre là où nous nous sommes arrêtés si le processus est interrompu.
Envelopper le contenu de la boucle (« traiter l'élément ») dans begin/commit tran ne fait pas l'affaire ... il semble que toute la déclaration
EXEC UpdateRemoteServer
est traité comme une seule transaction . Comment puis-je faire de chaque processus d'article une transaction complète et distincte?
Notez que j'aimerais exécuter ces comme « mises à jour non-traitées », mais cette option est disponible (pour autant que je sache) en 2008.
Merci pour l'info. Cela répond effectivement à la question. En dehors de cela, je sais que les curseurs sucent. Dans ce cas, ce n'est pas le curseur qui cause le problème de performance * en soi *, mais le travail effectué à l'intérieur de la boucle. Mais c'est une question distincte. – harpo
Je ne suis pas d'accord avec "cursors suck", mais c'est une discussion différente. – Thorsten
@IronGoofy: vous avez raison; Les curseurs sont des outils spécialisés qui doivent être utilisés dans une circonstance spécialisée (comme un extracteur de vis, vous n'en avez pas besoin tous les jours, si vous le faites, vous faites quelque chose de mal). Dire "ils sucent" est plus facile. :) –