Funciones escalares definidas por el usuario para OLTP en memoriaScalar User-Defined Functions for In-Memory OLTP

SE APLICA A: síSQL Server síAzure SQL Database noAzure SQL Data Warehouse noAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

En SQL Server 2016 (13.x)SQL Server 2016 (13.x), puede crear y eliminar funciones escalares definidas por el usuario y compiladas de forma nativa.In SQL Server 2016 (13.x)SQL Server 2016 (13.x), you can create and drop natively compiled, scalar user-defined functions. También puede modificar estas funciones definidas por el usuario.You can also alter these user-defined functions. La compilación nativa mejora el rendimiento de la evaluación de funciones definidas por el usuario en Transact-SQL.Native compilation improves performance of the evaluation of user-defined functions in Transact-SQL.

Cuando se modifica una función escalar definida por el usuario y compilada de forma nativa, la aplicación sigue estando disponible mientras se está ejecutando la operación y compilando la nueva versión.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 saber qué construcciones T-SQL se admiten, vea Características admitidas en los módulos T-SQL compilados de forma nativa.For supported T-SQL constructs, see Supported Features for Natively Compiled T-SQL Modules.

Creación, eliminación y modificación de funciones definidas por el usuarioCreating, Dropping, and Altering User-Defined Functions

Utilice CREATE FUNCTION para crear la función escalar definida por el usuario y compilada de forma nativa, DROP FUNCTION para quitar la función definida por el usuario y ALTER FUNCTION para cambiarla.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. El bloque BEGIN ATOMIC WITH es necesario para las funciones definidas por el usuario.BEGIN ATOMIC WITH is required for the user-defined functions.

Para obtener información sobre la sintaxis admitida y las restricciones, consulte los temas siguientes.For information about the supported syntax and any restrictions, see the following topics.

El procedimiento almacenado sp_recompile (Transact-SQL) se puede usar con la función escalar definida por el usuario y compilada de forma nativa.The sp_recompile (Transact-SQL)stored procedure can be used with the natively compiled, scalar user-defined function. Se creará la función que se va a volver a compilar con la definición que hay en los metadatos.It will result in the function being recompiled using the definition that exists in metadata.

En el ejemplo siguiente se muestra una UDF escalar de la base de datos de muestra 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  

Llamar a funciones definidas por el usuarioCalling User-Defined Functions

Las funciones escalares definidas por el usuario y compiladas de forma nativa pueden utilizarse en las expresiones, en el mismo lugar que las funciones escalares integradas y las escalares definidas por el usuario interpretadas.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. Las funciones escalares definidas por el usuario y compiladas de forma nativa pueden utilizarse también con la instrucción EXECUTE, en una instrucción Transact-SQL y en un procedimiento almacenado compilado de forma nativa.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.

Puede utilizar estas funciones escalares definidas por el usuario en procedimientos almacenados compilados de forma nativa y en funciones definidas por el usuario compiladas de forma nativa, siempre que se permitan funciones integradas.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. También puede utilizar las funciones escalares definidas por el usuario y compiladas de forma nativa en los módulos de Transact-SQL tradicionales.You can also use natively compiled, scalar user-defined functions in traditional Transact-SQL modules.

Puede usar estas funciones escalares definidas por el usuario en el modo de interoperabilidad, siempre que puede usarse una función escalar definida por el usuario interpretada.You can use these scalar user-defined functions in interop mode, wherever an interpreted scalar user-defined function can be used. Este uso está sujeto a limitaciones de transacción entre contenedores, tal y como se describe en la sección sobre niveles de aislamiento admitidos para transacciones entre contenedores del tema Transactions with Memory-Optimized Tables(Transacciones con tablas con optimización para memoria).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 obtener más información sobre el modo de interoperabilidad, vea Acceso a tablas con optimización para memoria mediante Transact-SQL interpretado.For more information about interop mode, see Accessing Memory-Optimized Tables Using Interpreted Transact-SQL.

Las funciones escalares definidas por el usuario y compiladas de forma nativa requieren un contexto de ejecución explícita.Natively compiled, scalar user-defined functions do require an explicit execution context. Para obtener más información, vea EXECUTE AS (cláusula de Transact-SQL).For more information, see EXECUTE AS Clause (Transact-SQL). No se admite EXECUTE AS CALLER.EXECUTE AS CALLER is not supported. Para obtener más información, vea EXECUTE (Transact-SQL).For more information, see EXECUTE (Transact-SQL).

Para conocer la sintaxis compatible con las instrucciones Transact-SQL Execute para funciones escalares definidas por el usuario y compiladas de forma nativa, vea EXECUTE (Transact-SQL).For the supported syntax for Transact-SQL Execute statements, for natively compiled, scalar user-defined functions, see EXECUTE (Transact-SQL). Para conocer la sintaxis compatible con la ejecución de las funciones definidas por el usuario en un procedimiento almacenado compilado de forma nativa, vea Características admitidas en los módulos T-SQL compilados de forma nativa.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.

Sugerencias y parámetrosHints and Parameters

La compatibilidad con las sugerencias de tablas, combinaciones y consultas de las funciones escalares definidas por el usuario y compiladas de forma nativa es la misma que la de estas sugerencias para procedimientos almacenados compilados de forma nativa.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. Al igual que con las funciones escalares definidas por el usuario, las sugerencias de consulta incluidas en una consulta Transact-SQL que hace referencia a una función escalar definida por el usuario y compilada de forma nativa no afectan el plan de consulta de esta función definida por el usuario.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.

Los parámetros compatibles con las funciones escalares definidas por el usuario y compiladas de forma nativa son aquellos que se admiten en los procedimientos almacenados compilados de forma nativa, siempre que se permitan los parámetros en las funciones escalares definidas por el usuario.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. Un ejemplo de un parámetro compatible es el parámetro con valores de tabla.An example of a supported parameter is the table-valued parameter.

Enlazadas al esquemaSchema-Bound

La siguiente información se aplica a las funciones escalares definidas por el usuario y compiladas de forma nativa.The following apply to natively compiled, scalar user-defined functions.

  • Deben estar enlazadas al esquema mediante el argumento WITH SCHEMABINDING en CREATE FUNCTION y ALTER FUNCTION.Must be schema-bound, by using the WITH SCHEMABINDING argument in the CREATE FUNCTION and ALTER FUNCTION.

  • No se pueden quitar ni modificar cuando se hacen referencia a estas mediante una función definida por el usuario o un procedimiento almacenado enlazados al esquema.Cannot be dropped or altered when referenced by a schema-bound stored procedure or user-defined function.

SHOWPLAN_XMLSHOWPLAN_XML

Las funciones escalares definidas por el usuario y compiladas de forma nativa admiten SHOWPLAN_XML.Natively compiled, scalar user-defined functions support SHOWPLAN_XML. Siguen las especificaciones del esquema general SHOWPLAN_XML, al igual que con los procedimientos almacenados compilados de forma nativa.It conforms to the general SHOWPLAN_XML schema, as with natively compiled stored procedures. El elemento base de las funciones definidas por el usuario es <UDF>.The base element for the user-defined functions is <UDF>.

STATISTICS XML no es compatible con las funciones escalares definidas por el usuario y compiladas de forma nativa.STATISTICS XML is not supported for natively compiled, scalar user-defined functions. Al ejecutar una consulta que hace referencia a la función definida por el usuario, con la opción STATISTICS XML habilitada, se devuelve el contenido XML sin la parte de la función definida por el usuario.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.

PermisosPermissions

Al igual que con los procedimientos almacenados compilados de forma nativa, se comprueban los permisos de los objetos a los que se hacen referencia desde una función escalar definida por el usuario y compilada de forma nativa cuando se crea la función.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 no funciona correctamente si el usuario suplantado no tiene los permisos correctos.The CREATE FUNCTION fails if the impersonated user does not have the correct permissions. Si como resultado de los cambios en los permisos, el usuario suplantado no vuelve a tener los permisos correctos, se producirá un error en las ejecuciones posteriores de la función definida por el usuario.If permission changes result in the impersonated user no longer having the correct permissions, subsequent executions of the user-defined function fail.

Cuando se utiliza una función escalar definida por el usuario y compilada de forma nativa dentro de un procedimiento almacenado compilado de forma nativa, se comprueban los permisos para ejecutar la función definida por el usuario cuando se crea el procedimiento externo.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. Si el usuario suplantado por el procedimiento externo no tiene permisos de ejecución de la función definida por el usuario, se produce un error en la creación del procedimiento almacenado.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. Si debido a cambios en los permisos, el usuario ya no vuelve a tener permisos de ejecución, se producirá un error en la ejecución del procedimiento externo.If permission changes result in the user no longer having the EXEC permissions, the execution of the outer procedure fails.

Consulte tambiénSee Also

Funciones integradas (Transact-SQL) Built-in Functions (Transact-SQL)
Guardar un plan de ejecución en formato XMLSave an Execution Plan in XML Format