Ich habe einige Tests mit einer langen Logik ausgeführt, wobei das gleiche Codebit (eine lange SELECT-Anweisung) sowohl in einer Tabellenwertfunktion als auch in einer gespeicherten Prozedur und einer geraden EXEC / SELECT-Funktion ausgeführt wurde und jeweils identisch ausgeführt wurde.
Meiner Meinung nach verwenden Sie immer eine Tabellenwertfunktion anstelle einer gespeicherten Prozedur, um eine Ergebnismenge zurückzugeben, da dies die Logik in Abfragen, die anschließend mit ihnen verknüpft werden, viel einfacher und lesbarer macht und es Ihnen ermöglicht, dieselbe Logik wiederzuverwenden. Um zu viele Leistungseinbußen zu vermeiden, verwende ich häufig "optionale" Parameter (dh Sie können NULL an sie übergeben), damit die Funktion die Ergebnismenge schneller zurückgeben kann, z.
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
Auf diese Weise können Sie diese Funktion für viele verschiedene Situationen verwenden und keinen großen Leistungseinbruch erleiden. Ich glaube, das ist effizienter als das anschließende Filtern:
SELECT * FROM dbo.getSitePermissions(@RegionID) WHERE SiteID = 1
Ich habe diese Technik in mehreren Funktionen verwendet, manchmal mit einer langen Liste von "optionalen" Parametern dieses Typs.