2009-06-24 3 views
0

J'essaie de générer quelques sql qui sont utilisés pour calculer quelques notes finales -> pensent les enfants à l'école et leurs scores de fin d'année. J'allais avoir environ 5 UDF scalaires qui, acceptent des valeurs simples (par exemple le score actuel, subjectid, peu importe), puis cracher une valeur décimale.Est-il mauvais d'utiliser une FDU SQL Server scalaire dans ce scénario?

par ex.

CREATE FUNCTION [dbo].[GetRatingModifier] 
(
    @ExamScore DECIMAL(6, 2), 
    @Project1Score DECIMAL(6, 2), 
    @Project1Score DECIMAL(6, 2), 
    @Project1Score DECIMAL(6, 2), 
    @SubjectTypeId TINYINT 
) 
RETURNS DECIMAL(8,5) 
AS 
BEGIN 
    DECLARE @Score DECIMAL(8,5) 

    SELECT @Score = (CASE @Project1Score 
        WHEN 1 THEN 10 
        WHEN 2 THEN 12.4 
         ....) + 
        (CASE blah.. u get the drift).. 
    RETURN @Score 
END 

La logique n'a que des maths. Pas de sélection xxx de la table yyy etc.

Alors, est-ce ok à faire en ce qui concerne la performance?

+0

À quel point cela serait-il difficile à tester? – JeffO

Répondre

3

Bien sûr, pas de problème - les performances seront presque les mêmes que si vous le faisiez en ligne à chaque SELECT. Je ne pense pas que ce soit un problème du tout - au contraire, le mettre dans un UDF semble être une très bonne idée! (pour garder votre code T-SQL propre et simple).

Marc

+0

Donc udf doit être considéré avec prudence dans la clause select, si le udf lui-même, fait un peu de bla à partir de la table foo, etc .. ?? (J'ai lu quelques trucs aujourd'hui sur udf ne sont pas très bon à utiliser re: performance .. et même en essayant d'utiliser TVF à la place ..)? –

+0

UDF sont d'accord - il suffit de ne pas les utiliser. Je les aime pour mettre un tas de cas ... ensemble en un seul endroit - ne pas éclabousser votre code avec une répétition inutile. –

+0

Et un UDF peut être un bon choix pour des choses comme les recherches et ainsi de suite - juste être conscient de ce qu'ils font! Utilisez-les avec soin - et tout ira bien! –

1

Oui, c'est une mauvaise idée parce que vous devez mettre tous vos poids de score dans une table et d'effectuer une jointure pour obtenir le résultat.

Questions connexes