用于内存中 OLTP 的标量用户定义函数

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例

在 SQL Server 2016 (13.x) 中,你可以创建和删除本机编译标量用户定义函数。 还可以修改这些用户定义函数。 本机编译可提高 Transact-SQL 中用户定义函数的计算性能。

如果修改本机编译标量用户定义函数,那么在执行操作以及编译新版本函数的同时,该应用程序仍然可用。

有关支持的 T-SQL 构造,请参阅 本机编译的 T-SQL 模块支持的功能

创建、删除和修改用户定义函数

使用该 CREATE FUNCTION 函数创建本机编译的标量用户定义函数、 DROP FUNCTION 删除用户定义的函数以及 ALTER FUNCTION 更改函数。 用户定义函数需要使用 BEGIN ATOMIC WITH。

有关支持的语法和任何限制的信息,请参阅下列主题。

sp_recompile (Transact-SQL) 存储过程可与本机编译的标量用户定义的函数一起使用。 它将导致使用元数据中存在的定义重新编译该函数。

以下示例展示了来自 AdventureWorks2022 示例数据库的一个标量 UDF。

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 查询中包含的查询提示不会影响此用户定义函数的查询计划。

本机编译的标量用户定义函数所支持的参数,与本机编译存储过程所支持的参数相同,前提是这些参数可用于标量用户定义函数。 其中一个支持的参数示例就是表值参数。

模式绑定

下列各项适用于本机编译标量用户定义函数。

  • 必须通过在 CREATE FUNCTION 和 ALTER FUNCTION 中使用 WITH SCHEMABINDING 参数来实现模式绑定。

  • 如果由架构绑定存储过程或用户定义函数引用,则不能删除或更改。

SHOWPLAN_XML

本机编译的标量用户定义函数支持 SHOWPLAN_XML。 它符合常规 SHOWPLAN_XML 架构,与本机编译的存储过程一样。 用户定义函数的基元素是 <UDF>

本机编译的标量用户定义函数不支持 STATISTICS XML。 运行引用用户定义函数的查询时,启用 STATISTICS XML 后,将返回 XML 内容,而不返回用户定义的函数的部件。

权限

与本机编译存储过程一样,创建函数时,将检查从本机编译标量用户定义函数引用的对象的权限。 如果被模拟的用户没有相应的权限,CREATE FUNCTION 就会失败。 如果权限更改导致模拟的用户不再具有正确的权限,用户定义函数的后续执行将失败。

当您在本机编译的存储过程中使用本机编译的标量用户定义函数时,系统会在创建外部存储过程时检查执行该用户定义函数的权限。 如果外部过程模拟的用户对用户定义函数没有 EXEC 权限,该存储过程的创建将失败。 如果权限更改导致用户不再具有 EXEC 权限,外部过程的执行将失败。

另请参阅

内置函数 (Transact-SQL)
以 XML 格式保存执行计划