Скалярные пользовательские функции для выполняющейся в памяти OLTP
Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure
В SQL Server 2016 (13.x) можно создавать и удалять собственные скомпилированные скалярные пользовательские функции. Их также можно изменять. Компиляция в собственном коде повышает производительность вычисления определяемых пользователем функций в Transact-SQL.
Если изменить скомпилированную в собственном коде скалярную определяемую пользователем функцию, приложение остается доступным при выполнении операции и компилируется новая версия функции.
Сведения о поддерживаемых конструкциях T-SQL см. в статье Поддерживаемые функции для модулей, скомпилированных в собственном коде T-SQL.
Создание, удаление и изменение определяемых пользователем функций
Для создания, удаления и изменения определяемых пользователем скомпилированных в собственном коде скалярных функций используются инструкции CREATE FUNCTION, DROP FUNCTION и ALTER FUNCTION соответственно. Инструкция BEGIN ATOMIC WITH требуется для определяемых пользователем функций.
Сведения о поддерживаемом синтаксисе и ограничениях см. в следующих статьях.
-
Синтаксис инструкции DROP FUNCTION для скомпилированных в собственном коде скалярных определяемых пользователем функций аналогичен синтаксису для интерпретируемых определяемых пользователем функций.
Хранимая процедура sp_recompile (Transact-SQL) может использоваться с скомпилированной, скалярной определяемой пользователем функцией. При этом произойдет повторная компиляция функции с использованием определения в метаданных.
В следующем примере показан скалярный UDF из примера базы данных AdventureWorks2022 .
CREATE FUNCTION [dbo].[ufnLeadingZeros_native](@Value int)
RETURNS varchar(8)
WITH NATIVE_COMPILATION, SCHEMABINDING
AS
BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'English')
DECLARE @ReturnValue varchar(8);
SET @ReturnValue = CONVERT(varchar(8), @Value);
DECLARE @i int = 0, @count int = 8 - LEN(@ReturnValue)
WHILE @i < @count
BEGIN
SET @ReturnValue = '0' + @ReturnValue;
SET @i += 1
END
RETURN (@ReturnValue);
END
Вызов пользовательских функций
Скомпилированные в собственном коде скалярные определяемые пользователем функции можно использовать в выражениях там же, где и встроенные скалярные функции, и интерпретируемые скалярные определяемые пользователем функции. Скомпилированные в собственном коде скалярные определяемые пользователем функции можно также использовать с инструкцией EXECUTE, в инструкции Transact-SQL и в скомпилированной в собственном коде хранимой процедуре.
Эти скалярные определяемые пользователем функции можно использовать в скомпилированных в собственном коде хранимых процедурах и скомпилированных в собственном коде определяемых пользователем функциях, а также везде, где можно использовать встроенные функции. Кроме того, скомпилированные в собственном коде скалярные определяемые пользователем функции можно использовать в традиционных модулях Transact-SQL.
Эти функции можно использовать в режиме взаимодействия при условии поддержки интерпретируемых скалярных определяемых пользователем функций. В этом случае есть ограничения для транзакций между контейнерами, как описано в разделе Поддерживаемые уровни изоляции для транзакций между контейнерами статьи Операции с таблицами, оптимизированными для памяти. Дополнительные сведения о режиме взаимодействия см. в статье Доступ к таблицам, оптимизированным для памяти, с помощью интерпретируемых инструкций Transact-SQL.
Скомпилированным в собственном коде скалярным определяемым пользователем функциям требуется явно выраженный контекст выполнения. Дополнительные сведения см. в разделе EXECUTE AS (Transact-SQL). Инструкция EXECUTE AS CALLER не поддерживается. Дополнительные сведения см. в статье EXECUTE (Transact-SQL).
Поддерживаемый синтаксис инструкций Transact-SQL Execute, для скомпилированных в собственном коде скалярных пользовательских функций см. в разделе EXECUTE (Transact-SQL). Сведения о поддерживаемом синтаксисе для выполнения определяемых пользователем функций в скомпилированной в собственном коде хранимой процедуре см. в статье Поддерживаемые функции для модулей, скомпилированных в собственном коде T-SQL.
Указания и параметры
Поддержка указаний таблиц, соединений и запросов в скомпилированных в собственном коде скалярных определяемых пользователем функциях осуществляется так же, как и в скомпилированных хранимых процедурах. Как и в случае с интерпретируемыми скалярными определяемыми пользователем функциями, указания запросов в Transact-SQL, которые ссылаются на скомпилированные в собственном коде скалярные определяемые пользователем функции, не влияют на план запроса для этой определяемой пользователем функции.
Скомпилированные в собственном коде скалярные определяемые пользователем функции поддерживают те же параметры, что и скомпилированные в собственном коде хранимые процедуры, при условии, что эти параметры можно использовать в скалярных определяемых пользователем функциях. Пример поддерживаемого параметра — параметр с табличным значением.
Привязка к схеме
Следующие сведения касаются скомпилированных в собственном коде скалярных определяемых пользователем функций.
Функции нужно привязать к схеме, использовав аргумент WITH SCHEMABINDING в инструкции CREATE FUNCTION и ALTER FUNCTION.
Функцию нельзя удалить или изменить, если на нее ссылается хранимая процедура с привязкой к схеме или определяемая пользователем функция.
SHOWPLAN_XML
Скомпилированные в собственном коде скалярные определяемые пользователем функции поддерживают инструкцию SHOWPLAN_XML. Она соответствует общей схеме SHOWPLAN_XML, как и в случае со скомпилированными в собственном коде хранимыми процедурами. Базовый элемент определяемых пользователем функций — это <UDF>
.
Скомпилированные в собственном коде скалярные определяемые пользователем функции не поддерживают STATISTICS XML. При выполнении запроса со ссылкой на определяемую пользователем функцию с заданной инструкцией STATISTICS XML содержимое XML возвращается без части, отвечающей за определяемую пользователем функцию.
Разрешения
Как и в случае со скомпилированными в собственном коде хранимыми процедурами, разрешения для объектов, указанных в скомпилированной в собственном коде скалярной определяемой пользователем функции, проверяются при создании функции. CREATE FUNCTION завершается сбоем, если у воплощаемого пользователя нет необходимых разрешений. Если во время изменения разрешений воплощаемый пользователь теряет соответствующие разрешения, последующее выполнение определяемой пользователем функции также завершается сбоем.
При использовании скомпилированной в собственном коде скалярной определяемой пользователем функции в скомпилированной в собственном коде хранимой процедуре разрешения на выполнение определяемой пользователем функции проверяются при создании внешней процедуры. Если у пользователя, олицетворенного внешней процедурой, нет разрешений EXEC для определяемой пользователем функции, происходит сбой создания хранимой процедуры. Если во время изменения разрешений пользователь теряет разрешения EXEC, происходит сбой выполнения внешней процедуры.
См. также
Встроенные функции (Transact-SQL)
Сохранение плана выполнения в формате XML