Funções escalares definidas pelo usuário para OLTP na MemóriaScalar User-Defined Functions for In-Memory OLTP

APLICA-SE A: simSQL Server simBanco de Dados SQL do Azure nãoAzure Synapse Analytics (SQL DW) nãoParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

No SQL Server 2016 (13.x)SQL Server 2016 (13.x), você pode criar e remover funções escalares definidas pelo usuário compiladas de modo nativo.In SQL Server 2016 (13.x)SQL Server 2016 (13.x), you can create and drop natively compiled, scalar user-defined functions. Também pode alterar essas funções definidas pelo usuário.You can also alter these user-defined functions. A compilação nativa melhora o desempenho da avaliação de funções definidas pelo usuário no Transact-SQL.Native compilation improves performance of the evaluation of user-defined functions in Transact-SQL.

Quando você altera uma função escalar definida pelo usuário e compilada nativamente, o aplicativo permanecerá disponível enquanto a operação estiver sendo executada e a nova versão da função estiver sendo compilada.When you alter a natively compiled, scalar user-defined function, the application remains available while the operation is being run and the new version of the function is being compiled.

Para obter os constructos T-SQL com suporte, veja Recursos com suporte para módulos T-SQL compilados de modo nativo.For supported T-SQL constructs, see Supported Features for Natively Compiled T-SQL Modules.

Criando, ignorando e alterando funções definidas pelo usuárioCreating, Dropping, and Altering User-Defined Functions

Você pode usar CREATE FUNCTION para criar a função escalar definida pelo usuário e compilada nativamente, a função DROP FUNCTION para remover a função definida pelo usuário e a função ALTER FUNCTION para alterar a função.You use the CREATE FUNCTION to create the natively compiled, scalar user-defined function, the DROP FUNCTION to remove the user-defined function, and the ALTER FUNCTION to change the function. BEGIN ATOMIC WITH é necessário para as funções definidas pelo usuário.BEGIN ATOMIC WITH is required for the user-defined functions.

Para saber mais sobre a sintaxe com suporte e as restrições, veja os tópicos a seguir.For information about the supported syntax and any restrictions, see the following topics.

O procedimento armazenado sp_recompile (Transact-SQL) pode ser usado com a função escalar definida pelo usuário e compilada de modo nativo.The sp_recompile (Transact-SQL)stored procedure can be used with the natively compiled, scalar user-defined function. Isso fará a função ser recompilada usando a definição que existe nos metadados.It will result in the function being recompiled using the definition that exists in metadata.

O exemplo a seguir mostra uma UDF escalar do banco de dados de exemplo AdventureWorks2016CTP3 .The following sample shows a scalar UDF from the AdventureWorks2016CTP3 sample database.

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  

Chamando funções definidas pelo usuárioCalling User-Defined Functions

As funções escalares definidas pelo usuário e compiladas nativamente podem ser usadas em expressões, no mesmo local que as funções escalares internas e as funções escalares interpretadas definidas pelo usuário.Natively compiled, scalar user-defined functions can be used in expressions, in the same place as built-in scalar functions and interpreted scalar user-defined functions. As funções escalares definidas pelo usuário e compilados também podem ser usadas com a instrução EXECUTE em uma instrução Transact-SQL e em um procedimento armazenado compilado nativamente.Natively compiled, scalar user-defined functions can also be used with the EXECUTE statement, in a Transact-SQL statement and in a natively compiled stored procedure.

Você pode usar essas funções escalares definidas pelo usuário em procedimentos armazenados compilados nativamente e funções definidas pelo usuário e compiladas nativamente, onde as funções internas forem permitidas.You can use these scalar user-defined functions in natively compiled store procedures and natively compiled user-defined functions, and wherever built-in functions are permitted. Você também pode usar funções escalares definidas pelo usuário e compiladas nativamente em módulos tradicionais de Transact-SQL.You can also use natively compiled, scalar user-defined functions in traditional Transact-SQL modules.

Você pode usar essas funções escalares definidas pelo usuário em modo de interoperabilidade, sempre que uma função escalar interpretada definida pelo usuário puder ser usada.You can use these scalar user-defined functions in interop mode, wherever an interpreted scalar user-defined function can be used. Esse uso está sujeito a limitações de transação entre contêineres, conforme descrito na seção Níveis de isolamento com suporte para transações entre contêineres no Transações com tabelas com otimização de memória.This use is subject to cross-container transaction limitations, as described in Supported Isolation Levels for Cross-Container Transactions section in Transactions with Memory-Optimized Tables. Para obter mais informações sobre o modo de interoperabilidade, veja Acessando tabelas com otimização de memória usando Transact-SQL interpretado.For more information about interop mode, see Accessing Memory-Optimized Tables Using Interpreted Transact-SQL.

As funções escalares definidas pelo usuário e compiladas nativamente exigem um contexto de execução explícito.Natively compiled, scalar user-defined functions do require an explicit execution context. Para obter mais informações, veja Cláusula EXECUTE AS (Transact-SQL).For more information, see EXECUTE AS Clause (Transact-SQL). EXECUTE AS CALLER não tem suporte.EXECUTE AS CALLER is not supported. Para obter mais informações, veja EXECUTE (Transact-SQL).For more information, see EXECUTE (Transact-SQL).

Para obter a sintaxe com suporte para as instruções Execute do Transact-SQL, para funções escalares definidas pelo usuário e compiladas de modo nativo, veja EXECUTE (Transact-SQL).For the supported syntax for Transact-SQL Execute statements, for natively compiled, scalar user-defined functions, see EXECUTE (Transact-SQL). Para obter a sintaxe com suporte para executar as funções definidas pelo usuário em um procedimento armazenado compilado de modo nativo, veja Recursos com suporte em módulos T-SQL compilados de modo nativo.For the supported syntax for executing the user-defined functions in a natively compiled stored procedure, see Supported Features for Natively Compiled T-SQL Modules.

Dicas e parâmetrosHints and Parameters

O suporte para tabela, junção e dicas de consulta dentro de funções escalares definidas pelo usuário e compiladas nativamente é igual ao suporte para essas dicas para procedimentos armazenados compilados nativamente.Support for table, join, and query hints inside natively compiled, scalar user-defined functions is equal to support for these hints for natively compiled stored procedures. Assim como acontece com funções escalares interpretadas definidas pelo usuário, as dicas de consulta incluídas com uma consulta Transact-SQL que fazem referência a uma função escalar definida pelo usuário e compilada nativamente não afetam o plano de consulta para essa função definida pelo usuário.As with interpreted scalar user-defined functions, the query hints included with a Transact-SQL query that reference a natively compiled, scalar user-defined function do not impact the query plan for this user-defined function.

Os parâmetros com suporte para as funções escalares definidas pelo usuário e compiladas nativamente são todos com suporte para procedimentos armazenados compilados nativamente, desde que os parâmetros sejam permitidos para funções escalares definidas pelo usuário.The parameters supported for the natively compiled, scalar user-defined functions are all the parameters supported for natively compiled stored procedures, as long as the parameters are allowed for scalar user-defined functions. Um exemplo de um parâmetro com suporte é o parâmetro com valor de tabela.An example of a supported parameter is the table-valued parameter.

Associada a esquemaSchema-Bound

O item a seguir aplica-se a funções escalares definidas pelo usuário compiladas de modo nativo.The following apply to natively compiled, scalar user-defined functions.

  • Deve ser associada a um esquema, usando o argumento WITH SCHEMABINDING no CREATE FUNCTION e ALTER FUNCTION.Must be schema-bound, by using the WITH SCHEMABINDING argument in the CREATE FUNCTION and ALTER FUNCTION.

  • Não pode ser descartada ou alterada quando referenciada por um procedimento armazenado de associação a esquema ou função definida pelo usuário.Cannot be dropped or altered when referenced by a schema-bound stored procedure or user-defined function.

SHOWPLAN_XMLSHOWPLAN_XML

Funções escalares definidas pelo usuário compiladas de modo nativo dão suporte a SHOWPLAN_XML.Natively compiled, scalar user-defined functions support SHOWPLAN_XML. Ele segue o esquema geral SHOWPLAN_XML, assim como acontece com procedimentos armazenados compilados nativamente.It conforms to the general SHOWPLAN_XML schema, as with natively compiled stored procedures. O elemento base para as funções definidas pelo usuário é <UDF>.The base element for the user-defined functions is <UDF>.

STATISTICS XML não tem suporte para funções escalares definidas pelo usuário e compiladas nativamente.STATISTICS XML is not supported for natively compiled, scalar user-defined functions. Quando você executa uma consulta que referencia a função definida pelo usuário, com STATISTICS XML habilitado, o conteúdo de XML é retornado sem a parte da função definida pelo usuário.When you run a query referencing the user-defined function, with STATISTICS XML enabled, the XML content is returned without the part for the user-defined function.

PermissõesPermissions

Assim como acontece com procedimentos armazenados compilados nativamente, as permissões para objetos referenciados de uma função escalar definida pelo usuário e compilada nativamente são verificadas quando a função é criada.As with natively compiled stored procedures, the permissions for objects referenced from a natively compiled, scalar user-defined function are checked when the function is created. CREATE FUNCTION falhará se o usuário representado não tiver as permissões corretas.The CREATE FUNCTION fails if the impersonated user does not have the correct permissions. Se as alterações de permissão fizerem o usuário representado perder as permissões corretas, haverá falha nas execuções subsequentes da função definida pelo usuário.If permission changes result in the impersonated user no longer having the correct permissions, subsequent executions of the user-defined function fail.

Quando você usa uma função escalar definida pelo usuário e compilada nativamente dentro de um procedimento armazenado compilado nativamente, as permissões para executar a função definida pelo usuário serão verificadas quando o procedimento externo tiver sido criado.When you use a natively compiled, scalar user-defined function inside a natively compiled stored procedure, the permissions for executing the user-defined function are checked when the outer procedure is created. Se o usuário representado pelo procedimento externo não tiver permissões EXEC para a função definida pelo usuário, haverá falha na criação do procedimento armazenado.If the user impersonated by the outer procedure does not have EXEC permissions for the user-defined function, the creation of the stored procedure fails. Se as alterações de permissão fizerem o usuário perder as permissões de EXEC, ocorrerá falha na execução do procedimento externo.If permission changes result in the user no longer having the EXEC permissions, the execution of the outer procedure fails.

Consulte TambémSee Also

Funções internas (Transact-SQL) Built-in Functions (Transact-SQL)
Salvar um plano de execução em formato XMLSave an Execution Plan in XML Format