J'ai exécuté quelques tests avec un long bit de logique, avec le même bit de code (une longue instruction SELECT) fonctionnant à la fois dans une fonction de table et une procédure stockée, et un EXEC / SELECT simple, et chacun exécuté de manière identique.
À mon avis, utilisez toujours une fonction à valeur de table plutôt qu'une procédure stockée pour renvoyer un jeu de résultats, car cela rend la logique beaucoup plus facile et lisible dans les requêtes qui les rejoignent par la suite, et vous permet de réutiliser la même logique. Pour éviter trop de problèmes de performance, j'utilise souvent des paramètres "optionnels" (c'est-à-dire que vous pouvez leur passer NULL) pour permettre à la fonction de renvoyer le jeu de résultats plus rapidement, par exemple:
CREATE FUNCTION dbo.getSitePermissions(@RegionID int, @optPersonID int, optSiteID int)
AS
RETURN
SELECT DISTINCT SiteID, PersonID
FROM dbo.SiteViewPermissions
WHERE (@optPersonID IS NULL OR @optPersonID = PersonID)
AND (@optSiteID IS NULL OR @optSiteID = SiteID)
AND @RegionID = RegionID
De cette façon, vous pouvez utiliser cette fonction dans de nombreuses situations différentes, et ne prenez pas un énorme impact sur les performances. Je pense que c'est plus efficace que de filtrer après:
SELECT * FROM dbo.getSitePermissions(@RegionID) WHERE SiteID = 1
J'ai utilisé cette technique dans plusieurs fonctions, parfois avec une longue liste de paramètres "optionnels" de ce type.