Принятый ответ является неточным / вводящим в заблуждение, главным образом из-за слишком расплывчатой цитируемой цитаты в отношении термина "пользовательские функции".
В Microsoft SQL Server есть несколько различных типов пользовательских функций, и они обрабатываются по-разному:
TVF с несколькими утверждениями:
Они рассматриваются как хранимые процедуры. Запрос, который их выполняет, показывает только ссылку на их имя, а не на их определение. Они появляются в sys.dm_exec_cached_plans
с cacheobjtype
в «Скомпилированном плане» и objtype
в «Proc». Любые значения входных параметров также сохраняются вместе с планом, поэтому для TVF с несколькими утверждениями возникают проблемы с прослушиванием параметров.
Встроенные TVF (iTVF):
Они рассматриваются как представления. Запрос, который их выполняет, включает их определение. Они появляются в sys.dm_exec_cached_plans
с cacheobjtype
из "Parse Tree" и objtype
из "View". Значения входных параметров , а не хранятся вместе с планом, поэтому встроенные TVF не подвержены проблемам с прослушиванием параметров.
Скалярные UDF:
Они рассматриваются как хранимые процедуры. Запрос, который их выполняет, показывает только ссылку на их имя, а не на их определение. Они появляются в sys.dm_exec_cached_plans
с cacheobjtype
в «Скомпилированном плане» и objtype
в «Proc». Любые значения входных параметров также сохраняются вместе с планом, поэтому скалярные пользовательские функции подвержены проблемам с прослушиванием параметров. Кроме того, в отличие от двух типов TVF, указанных выше, но, как и для обычных хранимых процедур, вы можете принудительно перекомпилировать план выполнения, используя опцию WITH RECOMPILE
при выполнении через EXEC[UTE]
вместо SELECT
или SET
.
Объекты SQLCLR:
Это больше похоже на код клиента / приложения. Запрос, который их выполняет, показывает только ссылку на их имя, а не на их определение. Они отображаются в sys.dm_exec_cached_plans
с cacheobjtype
«CLR Compiled Func» или «CLR Compiled Proc» и objtype
«Proc». Но, в отличие от TVF с несколькими операторами и скалярных UDF, у них нет определения и, следовательно, нет соответствующего плана запросов. Однако любые специальные запросы (не вызовы хранимых процедур), которые они выполняют, отображаются в sys.dm_exec_cached_plans
с cacheobjtype
«Скомпилированного плана» и objtype
«Подготовлено». Любой из этих специальных запросов, если он параметризован, должен хранить начальные значения входных параметров вместе с подготовленным планом, и, следовательно, будет подвержен проблемам с анализом параметров.
Подробнее о кэшировании объектов см. На странице MSDN Механизмы кэширования .
.