Je peux comprendre que l'on veuille éviter d'avoir à utiliser un curseur en raison de la surcharge et des inconvénients, mais il semble que l'on assiste à une véritable phobie du curseur et que les gens se donnent beaucoup de mal pour éviter d'avoir à en utiliser un.
Par exemple, une question demandait comment faire quelque chose de manifestement trivial avec un curseur et la réponse acceptée proposait d'utiliser une requête récursive CTE (Common Table Expression) avec une fonction récursive personnalisée, même si cela limite le nombre de lignes pouvant être traitées à 32 (en raison de la limite d'appels de fonctions récursives dans le serveur SQL). Cela me semble être une très mauvaise solution pour la longévité du système, sans parler de l'effort considérable que cela représente pour éviter d'utiliser un simple curseur.
Quelle est la raison de ce niveau de haine insensée ? Une "autorité reconnue" a-t-elle émis une fatwa contre les maudisseurs ? Un mal indicible rôde-t-il dans le cœur des maudits, corrompant la morale des enfants ou quelque chose du genre ?
Question Wiki, plus intéressée par la réponse que par le représentant.
Informations connexes :
Curseurs d'avance rapide de SQL Server
EDIT : je vais être plus précis : Je comprends que les curseurs ne doivent pas être utilisés à la place des opérations relationnelles normales ; c'est une évidence. Ce que je ne comprends pas, ce sont les gens qui font tout pour éviter les curseurs comme s'ils avaient des poux ou quelque chose comme ça, même quand un curseur est une solution plus simple et/ou plus efficace. C'est la haine irrationnelle qui me déconcerte, pas l'efficacité technique évidente.
1 votes
Je pense que votre éditorial en dit long... En presque dans toutes les situations (que j'ai rencontrées), il existe un moyen de remplacer un curseur par une situation basée sur un ensemble plus performant. Vous dites que c'est une évidence, mais vous comprenez la différence.
7 votes
J'adore les étiquettes de cette question !
2 votes
La partie concernant les limites récursives de l'ETC étant
32
est un non-sens. Vous pensez sans doute aux déclencheurs récursifs et à la fonction max@@NESTLEVEL
de32
. Il peut être défini dans la requête avecOPTION (MAXRECURSION N)
avec défaut100
y0
c'est-à-dire illimité.0 votes
@MartinSmith : la limite par défaut est maintenant de 100, et la limite maximale est de 32K. sql-server-helper.com/error-messages/msg-310.aspx
0 votes
Non, c'est toujours exactement la même chose que lorsque j'ai fait mon commentaire et dans toutes les versions de SQL Server qui supportent les CTE récursifs. Comme le dit votre lien, "Lorsque 0 est spécifié, aucune limite n'est appliquée".
1 votes
@MartinSmith : merci, mon erreur - deux erreurs, en fait ;) la première était une mauvaise lecture de la référence (j'ai supposé que la limite de 32K = 'illimité') et la seconde était la mauvaise cause - dans l'exemple cité, la limite de récursion de 32 provenait de la fonction récursive, pas du CTE. J'utilisais probablement SQL Server 2000, ou peut-être 2008, à l'époque, j'espère que c'est mieux maintenant :). Question éditée pour clarifier - j'apprécie votre correction !