2009-04-15 4 views
6

Je travaille sur une procédure stockée qui effectue certaines opérations sur les élèves de la classeDéfinir les opérations basées sur les procédures stockées et les appels

Dans la dernière étape, il met à jour le statut de certains des élèves en fonction de certains critères.

Tout est assez simple mais j'ai un dilemme ici. Fondamentalement, il y a un sp existant dans le système appelé

pUpdateStudentStatus(studentID, statusID, comments, userID) 

Cette sp est utilisé par l'application à chaque fois qu'un état d'un seul utilisateur doit être mis à jour. En dehors de la mise à jour de l'état, il consigne également les modifications dans la table StudentStatusHistory.

Voici donc mon dilemme,

  • si je veux utiliser cette procédure stockée je besoin boucle à travers les enregistrements (soit par curseur ou par moi-même boucle d'écriture)
  • si je veux garder toutes les opérations ensemble sur la base que je dois copier la logique du pUpdateStudentStatus (qui peut changer dans le futur)

Existe-t-il d'autres options? Lequel choisirais-tu?

je crois une approche alternative avec la gâchette de mise à jour n'est pas un moyen d'aller comme je l'ai besoin de quelques détails supplémentaires tels que userId de l'utilisateur qui a changé le statut et les commentaires

J'utilise SQLServer2005

Répondre

4

Vous ne dites pas si pUpdateStudentStatus est sous votre contrôle ou créé par un tiers.

S'il s'agit d'un SP tiers, je ne pense pas que vous ayez beaucoup d'autre choix que d'utiliser un curseur/boucle, puisque les internes du SP peuvent changer dans les prochaines versions. Si le SP est sous votre contrôle, une autre option serait de créer une version de pUpdateStudentStatus avec un nouveau nom qui fonctionnera en mode set (peut-être en acceptant une variable table d'arguments), puis réécrire le pUpdateStudentStatus existant pour agir comme un wrapper appelant la nouvelle procédure avec une seule ligne dans la table d'arguments.

+0

Merci Ed, en créant une nouvelle version basée sur les sons de sp comme une solution intéressante. Dans ce cas particulier je ne peux pas utiliser la table Variables (sqlServer2005) mais j'aime l'idée en général. – kristof

1

Si vous voulez garder le jeu basé sur l'opération alors oui, malheureusement, vous devrez copier et coller le sql de pUpdateStudentStatus.

Vous devrez choisir entre les performances d'une mise à jour basée sur un ensemble d'une part, et la réutilisation de code (et la facilité de maintenance) d'autre part. Je sais ce que je choisirais normalement, mais votre choix dépend de votre besoin de performance par rapport à d'autres considérations.

+0

Je garde normalement l'ensemble des opérations sur la base, mais cette fois, je peut faire une exception, surtout parce que l'autre code est écrit et maintenu par un autre développeur et le nombre d'enregistrements affectés est vraiment petit, donc la performance ne devrait pas être un problème ici . Je me demandais s'il y avait des alternatives. – kristof

2

Personnellement, sauf si les performances sont un problème (et il semble que ce soit le genre de travail qui sera exécuté occasionnellement et peut-être même planifié en dehors des heures de travail), je boucle la procédure existante. Le processeur est invariablement moins cher que le temps de DBA/programmeur et les considérations de maintenance devraient l'emporter sur l'efficacité, à moins qu'il y ait un impact sur l'entreprise en ne le faisant pas. De toute façon, vous devriez documenter pourquoi vous avez adopté quelle que soit l'approche que vous choisissez dans le code.

En outre, si vous ne l'avez pas déjà un régime de documentation, je suggère la mise en place d'une simple table de documentation au sein de la base de données avec (au moins) le nom sp et un texte descriptif. En raison de la nature des procédures stockées/fonctions définies par l'utilisateur en gardant un contrôle général sur la fonctionnalité qui a été mise en œuvre où peut être difficile à moins qu'une stratégie soit adoptée et j'ai vu beaucoup trop de bases de données où il y a une masse de méthode simple de groking quelle fonctionnalité a été mise en œuvre où. Le contrôle de version et la documentation complète doivent être applaudis si votre groupe le prend en charge, mais si cela n'est pas disponible, documenter la base de données à l'intérieur est simple, robuste et rapide.

+0

Le nombre d'enregistrements affectés est vraiment faible, donc la performance ne devrait pas poser de problème ici. La boucle semble être le meilleur choix dans ce scénario. – kristof

+0

Sans aucun doute alors. Il y a une tendance malheureuse parmi beaucoup de programmeurs à obséder sur l'efficacité quand la maintenance est habituellement plus importante dans la pratique. Assurez-vous de faire des commentaires sur pourquoi bien que l'une de cette tendance vous appellera probablement un idiot plus tard quand ils rencontrent votre code. – Cruachan

1

Si vous faites un petit nombre d'enregistrements, en boucle est acceptable, mais si les processus de traitement par lots jamais obtenir grand, vous aurez besoin d'un code à base défini.

Une autre alternative à ce que d'autres ont suggéré si vous finissez par avoir besoin de la logique ensembliste est de changer le proc pour permettre soit basées sur des ensembles ou des inserts individuels. En rendant les paramètres facultatifs (votre interface graphique devra vérifier que tous les paramètres requis sont passés pour des insertions individuelles) et en ajoutant un paramètre pour qu'un numéro de lot soit transmis pour un fonctionnement basé sur un ensemble, vous pouvez mettre la logique pour les deux. proc.

Si le numéro de lot est nulle, ce que les actions en cours. Si elle est passée, allez à la partie de traitement par lots du proc. Pour les traitements par lots, le processus d'insertion peut être appelé par un autre processus qui génère un nouveau numéro de lot, insère les informations que vous souhaitez insérer dans une table de travail, y compris le numéro de lot. Ensuite, il utilise le batchnumebr comme paramètre d'entrée pour le processus d'insertion.

Vous aurez toujours écrire la logique pour les deux cas, mais comme ils sont dans le même proc, ils seront plus faciles à entretenir et vous serez moins susceptibles d'oublier de mettre à jour les deux processus.

Questions connexes