Я выполнил некоторые тесты с длинным битом логики, с одним и тем же битом кода (длинным оператором SELECT), выполняемым как в табличной функции, так и в хранимой процедуре, и в прямом EXEC / SELECT, и каждый из них выполнялся одинаково .
По моему мнению, всегда используйте табличную функцию, а не хранимую процедуру, чтобы возвращать набор результатов, поскольку она делает логику намного проще и удобнее для чтения в запросах, которые впоследствии присоединяются к ним, и позволяет повторно использовать ту же логику. Чтобы избежать слишком большого снижения производительности, я часто использую «необязательные» параметры (т. Е. Вы можете передать им NULL), чтобы функция могла быстрее возвращать результирующий набор, например ::100100
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
Таким образом, вы можете использовать эту функцию для множества различных ситуаций, и при этом вам не придется сильно снижать производительность. Я считаю, что это эффективнее, чем фильтрация потом:
SELECT * FROM dbo.getSitePermissions(@RegionID) WHERE SiteID = 1
Я использовал эту технику в нескольких функциях, иногда с длинным списком «необязательных» параметров этого типа.