2010-05-06 2 views

Répondre

1

Modifier UNDELETED au cas où vous décidez d'aller dans cette voie ...

CREATE FUNCTION [dbo].[products] 
     (
     @product_id int 
     ) 
    RETURNS TABLE 
    AS RETURN 
     (
    SELECT 
    sum(qty) as qty, 
     product_id 
     FROM vProductQuantity 
    WHERE 
    product_id = @product_id 
    ) 
+0

Les TVF en ligne comme celui-ci fonctionneront généralement mieux qu'une UDF scalaire, car l'optimiseur fait un meilleur travail. L'utilisation typique est la suivante: SELECT t. *, Products.qty DE t EXTER APPLY [dbo]. [Products] (t.product_id) produits AS –

+0

Aussi - si possible, résister à la tentation de créer un TVF multi-déclaration - ceux-ci ne peuvent pas être optimisés de la même manière que les TVF en ligne. –

1

Voici comment vous créer l'UDF afin qu'il retournera le valeur entière de la quantité de produit. Lorsque Martin a répondu, créez-le en tant que fonction de valeur de table pour renvoyer plusieurs valeurs.

+0

Il ne spécifie pas UDF scalaire - devinez que nous aurons besoin de cela clarifié! –

+0

scalaire, c'est ce que j'ai besoin – jeff

+0

Vous cherchez une valeur unique à retourner – jeff

2

Je vous recommande fortement de ne pas utiliser d'UDF scalaires pour tout traitement significatif. Pour les appels individuels, ce n'est pas mauvais, mais l'appeler pour un nombre significatif de lignes est généralement très mauvais.

Si vous appelez ceci pour plusieurs produits dans un autre jeu de lignes, la fonction UDF ne sera pas bien mise à l'échelle.

Une vue ou la fonction de table inline interprétera beaucoup mieux: dire

CREATE VIEW vQuantity AS 
SELECT 
sum(qty) as qty, 
    product_id 
    FROM vProductQuantity 
GROUP BY product_id 

et

SELECT * 
FROM t 
LEFT JOIN vQuantity ON vQuantity.product_id = t.product_id 

ou

CREATE FUNCTION udfQuantity(any params) RETURNS TABLE AS 
RETURN (
    SELECT 
    sum(qty) as qty, 
     product_id 
     FROM vProductQuantity 
    GROUP BY product_id 
) 

et

SELECT * 
FROM t 
LEFT JOIN udfQuantity(any params) AS Quantity ON Quantity.product_id = t.product_id 

Je vous recommande fortement de revoir le plan d'exécution de tout processus dans lequel vous utilisez une fonction UDF scalaire.

Questions connexes