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.
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 –
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. –