Я провел несколько тестов с длинным ходом логики с одним и тем же битом код (длинный оператор SELECT), выполняющийся как в таблице, так и в хранимой процедуре, и прямой EXEC/SELECT, и каждый выполняется одинаково.
На мой взгляд, всегда используйте функцию, отмеченную таблицей, а не хранимую процедуру, чтобы вернуть результирующий набор, поскольку он делает логику намного проще и читабельнее в запросах, которые впоследствии присоединяются к ним, и позволяет вам повторно использовать ту же логику. Для того, чтобы избежать слишком много удара по производительности, я часто использую «необязательные» параметры (например, вы можете передать NULL для них), чтобы включить функцию для возврата результирующего набора, чтобы быть быстрее, например:
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
Я использовал эту технику в нескольких функциях, иногда с длинным списком «необязательных» параметры этого типа.
Это кажется идеальным ответ: http://stackoverflow.com/a/1179778/365188 – 2015-10-27 05:04:24