适用于:SQL Server
Azure SQL 数据库
Azure SQL 托管实例
在 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) 存储过程可与本机编译的标量用户定义的函数一起使用。 它将导致使用元数据中存在的定义重新编译该函数。
以下示例展示了来自 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 权限,外部过程的执行将失败。