2016-11-10 6 views
7

В настоящее время я изучаю функции в sql-сервере, и я не понимаю, почему/когда вы будете использовать inline table valued function.Когда вы используете табличную функцию?

Я пробовал прочитать об этом и некоторых примерах, но мне все еще не ясно. Может ли кто-нибудь объяснить или обеспечить простой для понимания сценарий использования?

+1

Хотя я проголосовал за закрытие (слишком широко), одна ситуация, когда вы хотите, чтобы функция, зависящая от таблицы, - это когда вы хотите представление, которое может принимать параметры. –

+3

Поиск «String splitter», и вы увидите одно очень частое использование функции с табличной оценкой. Вы используете их в соединениях или в Cross Applys, чтобы делать много полезных вещей. – pmbAustin

+0

Сплит-функция также по разделительным значениям. –

ответ

9

Табличные функции являются «просто» параметризованными представлениями. Это делает их чрезвычайно мощными для инкапсуляции логики, которая иначе была бы скрыта за непрозрачной хранимой процедурой. Вот пример:

Инлайн табличного значения функции:

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. Это позволяет оптимизатору обрабатывать такие функции не иначе, как объекты, которые они инкапсулируют, что приводит к почти оптимальным планам производительности (при условии, что ваши индексы и статистика идеальны).

4

Это отличный вопрос и тема, которая не обсуждается достаточно ИМХО. Подумайте о встроенных табличных функциях как представлениях, которые принимают параметры. Это короткий ответ, но давайте копаем немного глубже ...

В SQL-сервере у вас есть три вида пользовательских функций *: скалярные функции (svf), многострочные табличные функции (mTVF) и встроенные таблицы функций (iTVF). svfs возвращает одно значение, и mTVF и iTVF возвращают таблицу. Разница между mTVF и iTVF - это производительность. Короче говоря, mTVF медленны, iTVF могут быть (и почти всегда) намного быстрее. mTVF позволяют делать то, что вы не могли сделать в представлении (например, создавать временные таблицы, выполнять циклы, использовать курсоры ...), iTVF, опять же, имеют те же ограничения, что и представления, за исключением того, что они могут кроме параметров.

Я использую iTFV для обычных запросов хранилища данных, где мне нужно представление, которое принимает параметры и разбивает/управляет строками. Более продвинутое использование iTVFs, который изменил мою карьеру меняет скалярные функции с iTVFs - эта статья Джефа Moden под названием «Как сделать Скалярное UDFs работать быстрее»: http://www.sqlservercentral.com/articles/T-SQL/91724/

  • Для простоты я исключила тему CLR и другие не-T-SQL типы функций.
Смежные вопросы