Скалярные определяемые пользователем функции для выполняющейся в памяти OLTP

Применимо к: даSQL Server (все поддерживаемые версии) ДаБаза данных SQL Azure

В SQL Server 2016 (13.x);можно создавать и удалять скомпилированные в собственном коде определяемые пользователем скалярные функции. Их также можно изменять. Компиляция в собственном коде повышает производительность вычисления определяемых пользователем функций в Transact-SQL.

Если изменить скомпилированную в собственном коде скалярную определяемую пользователем функцию, приложение остается доступным при выполнении операции и компилируется новая версия функции.

Сведения о поддерживаемых конструкциях T-SQL см. в статье Поддерживаемые функции для модулей, скомпилированных в собственном коде T-SQL.

Создание, удаление и изменение определяемых пользователем функций

Для создания, удаления и изменения определяемых пользователем скомпилированных в собственном коде скалярных функций используются инструкции CREATE FUNCTION, DROP FUNCTION и ALTER FUNCTION соответственно. Инструкция BEGIN ATOMIC WITH требуется для определяемых пользователем функций.

Сведения о поддерживаемом синтаксисе и ограничениях см. в следующих статьях.

Хранимую процедуру sp_recompile (Transact-SQL) можно использовать со скомпилированными в собственном коде определяемыми пользователем скалярными функциями. При этом произойдет повторная компиляция функции с использованием определения в метаданных.

Ниже приведен пример скалярной определяемой пользователем функции из примера базы данных AdventureWorks2016CTP3 .

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).

Сведения о поддерживаемом синтаксисе инструкций EXECUTE Transact-SQL для скомпилированных в собственном коде определяемых пользователем скалярных функций см. в статье 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