Табличные функции являются «просто» параметризованными представлениями. Это делает их чрезвычайно мощными для инкапсуляции логики, которая иначе была бы скрыта за непрозрачной хранимой процедурой. Вот пример:
Инлайн табличного значения функции:
create function dbo.GetClients (
@clientName nvarchar(50) = null
)
returns table
return (
select *
from dbo.Clients as a
where ((a.ClientName = @clientName) or a.ClientName is null)
);
хранимых процедуры:
create procedure dbo.usp_GetClients (
@clientName nvarchar(50) = null
)
as
begin;
select *
from dbo.Clients as a
where ((a.ClientName = @clientName) or a.ClientName is null)
end;
В отличии от вызова хранимой процедуры, функция табличного значения позволяет мне создавать логика от dbo.GetClients
с другими объектами:
select *
from dbo.GetClients(N'ACME') as a
join ... as b
on a.ClientId = b.ClientId
В таких ситуациях я не могу представить, как использовать хранимую процедуру из-за того, насколько она ограничительна по сравнению с табличной функцией. Я был бы вынужден маршалировать данные вокруг себя, используя временную таблицу, переменную таблицы или прикладной уровень, чтобы объединить результаты нескольких объектов.
Встроенные функции, имеющие значение в таблице, являются особенно впечатляющими из-за «встроенного» бита, который, вероятно, лучше всего объясняется here. Это позволяет оптимизатору обрабатывать такие функции не иначе, как объекты, которые они инкапсулируют, что приводит к почти оптимальным планам производительности (при условии, что ваши индексы и статистика идеальны).
Хотя я проголосовал за закрытие (слишком широко), одна ситуация, когда вы хотите, чтобы функция, зависящая от таблицы, - это когда вы хотите представление, которое может принимать параметры. –
Поиск «String splitter», и вы увидите одно очень частое использование функции с табличной оценкой. Вы используете их в соединениях или в Cross Applys, чтобы делать много полезных вещей. – pmbAustin
Сплит-функция также по разделительным значениям. –