Обычно я использую представления, где это возможно, для инкапсуляции низкоуровневой логики и соответствия. Если параметризованное представление (т. Е. Встроенная табличная функция) позволит вам обеспечить выполнение определенных параметров, я бы использовал это. Если необходимо выполнить действие с несколькими операторами, на этом этапе я бы использовал хранимую процедуру.
Преимущества представлений и встроенных табличных функций в том, что оптимизатор может управлять ими намного проще (представления можно комбинировать при построении плана выполнения), а представления и ITVF можно использовать так же, как таблицы, и объединять их с другими таблицами. , просмотры или ITVF практически без затрат по сравнению с повторением встроенного кода.
Например, код в ответе ChaosPandion может быть инкапсулирован в ITVF с использованием параметра (отличный способ гарантировать, что определенные параметры ВСЕГДА предоставляются - нет никакого способа гарантировать, что фильтр критерии будут предоставлены во внешнем SELECT) или в представлении (и параметр должен быть предоставлен вне представления). План выполнения в обоих случаях фактически будет эквивалентен, потому что оптимизатор может очень хорошо обрабатывать подобные случаи.
Наборы результатов хранимых процедур не могут быть объединены без предварительного размещения данных во временной таблице.
CREATE VIEW TableWithDefault
AS
Select Table.Id, Coalesce(OtherTable.Field, 'Default Value') As Value
From Table
Left Join OtherTable On Table.OtherTableId = OtherTable.Id
-- Usage: SELECT * FROM TableWithDefault WHERE Id = @Id
CREATE FUNCTION TableWithDefault(@Id int)
RETURNS TABLE
RETURN (
Select Coalesce(OtherTable.Field, 'Default Value') As Value
From Table
Left Join OtherTable On Table.OtherTableId = OtherTable.Id
Where Table.Id = @Id
)
-- Usage: SELECT * FROM TableWithDefault(@Id)
Теперь преимущества этого состоят в том, что эта логика может вызываться из различных хранимых процедур, представлений (OUTER APPLY, CROSS APPLY) и т. Д., И логика всегда находится в одном месте.