2008-10-22 6 views
3

Dites que j'ai une procédure stockée qui renvoie des données à partir d'une requête SELECT. J'aimerais obtenir une réduction légèrement différente de ces résultats en fonction des paramètres que je traverse. Je me demande s'il est préférable d'avoir plusieurs procédures stockées qui prennent un ou aucun paramètre pour le faire (par exemple, GetXByDate ou GetXByUser), ou une procédure stockée avec plusieurs paramètres qui font le lot (par exemple, GetX)? L'avantage de la première option est qu'elle est plus simple et peut-être plus rapide, mais l'inconvénient est que l'essence de la requête est dupliquée à travers les procédures stockées et doit être maintenue à plusieurs endroits. L'avantage de la seconde option est que la requête n'est présente qu'une seule fois, mais l'inconvénient est que la requête est plus complexe et plus difficile à dépanner.Vaut-il mieux écrire une procédure stockée plus ciblée avec moins de paramètres?

Qu'est-ce que vous utilisez dans vos solutions et pourquoi?

Répondre

4

Les procédures stockées plus complexes sont plus complexes pour le serveur SQL pour compiler et exécuter correctement rapidement et efficacement.

Même dans la grande procédure stockée, vous devez avoir plusieurs copies de la requête ou y ajouter beaucoup de CAS et d'IF, ce qui réduit les performances. Donc, vous ne gagnez pas beaucoup à tout regrouper. D'après mon expérience personnelle, je considère également que le grand code SQL avec beaucoup de branches est plus difficile à maintenir que plusieurs sprocs plus petits et plus simples.

Vous pouvez envisager d'utiliser des vues et des fonctions définies par l'utilisateur pour réduire le copier-coller du code de requête. Dire que si vous ne vous souciez pas de la performance (l'application intranet, les requêtes ne sont pas si lourdes, ne courez pas si souvent), vous pourriez trouver un sproc universel assez pratique.

0

Qui appellera ces procédures stockées? Je n'écrirais pas les procédures stockées pour les instructions SELECT normalement, précisément parce qu'il y a beaucoup d'instructions SELECT différentes, y compris les jointures à d'autres tables, etc.

2

Je préfère GetXByDate, GetXByUser, ... pour les procédures stockées simples, sur la base ils auront besoin de peu de maintenance de toute façon, et dans cette situation, je pense qu'il est plus facile de maintenir le code en double que le code compliqué.

Bien sûr, si vous avez des procédures stockées plus compliquées, cela peut ne pas être vrai. GetAndProcessXByDate peut être mieux réduit à GetXByDate, GetXByUser, ... qui appellent un autre proc processX stocké.

donc je suppose que la réponse définitive est: ça dépend ... :)

4

Je traiterais les procédures stockées de la même manière que je le ferais pour une classe. Il devrait faire une chose et le faire simplement. Envisagez d'appliquer les mêmes types de règles de refactoring/d'odeur de code à vos procédures stockées que vous le feriez pour votre code d'application.

1

Un avantage de la procédure stockée unique si vous utilisez une couche d'accès aux données C# générée comme LinqToSQL, une seule classe est générée pour représenter votre jeu de résultats.

2

Je seconde @tvanfosson.

Cependant, j'ajouterais que vous pouvez faire les deux: avoir un sproc multi-usage (par ex.GetX) qui contient la logique essentielle pour toute une classe de requêtes, et l'enveloppe dans une série de plus petits sprocs (GetXY, GetXZ) qui exécutent le grand, en passant dans les paramètres appropriés. Cela signifie que vous ne vous répétez pas, mais vous pouvez également fournir une interface simple aux applications clientes: une application qui n'appelle jamais que GetXY n'a pas besoin de connaître GetXZ.

Nous utilisons parfois cette approche.

1

L'approche AJs vous offre le meilleur des deux mondes. La douleur d'avoir à maintenir le code répété à travers plusieurs sprocs ne peut pas être surestimée.

Construire des modules Sproc et UDF pour une utilisation courante, et les appeler à partir de sprocs spécifiques à une tâche.

+0

merci :-) clairement vous êtes un individu très perspicace –

Questions connexes