适用于:Microsoft Fabric 中的 SQL 分析终结点和 Microsoft Fabric 中的仓库
CREATE FUNCTION 创建内联表值函数和标量函数。
注意
标量 UDF 是 Fabric 数据仓库中的预览功能。
重要
在 Fabric 数据仓库中, 标量 UDF 必须可内联 用于 SELECT ... FROM 用户表的查询,但仍然可以创建不可内联的函数。 非线化的标量UDF在有限的场景中有效。 可以检查 是否可以内联 UDF。
用户自定义函数是一种 Transact-SQL 例程,它接受参数,执行诸如复杂计算等操作,并将该操作的结果返回为值。 标量函数返回标量值,例如数字或字符串。 用户定义的表值函数 (TVF) 返回表。
使用 CREATE FUNCTION 它可以创建一个可重复使用的T-SQL例程,你可以以下方式使用:
- 在 Transact-SQL 语句中,例如
SELECT - 在 Transact-SQL 数据作语句(例如
UPDATE,INSERT和)DELETE - 在调用该函数的应用程序中
- 在另一个用户定义函数的定义中
- 用于替换存储过程
你可以指定 CREATE OR ALTER FUNCTION 创建一个新函数,如果某个函数没有该名称,或者在一个语句中修改已有函数。
语法
标量函数语法
CREATE FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] parameter_data_type
[ = default ] }
[ ,...n ]
]
)
RETURNS return_data_type
[ WITH <function_option> [ ,...n ] ]
[ AS ]
BEGIN
function_body
RETURN scalar_expression
END
[ ; ]
<function_option>::=
{
[ SCHEMABINDING ]
| [ RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ]
}
内联表值函数语法
CREATE FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] parameter_data_type
[ = default ] }
[ ,...n ]
]
)
RETURNS TABLE
[ WITH SCHEMABINDING ]
[ AS ]
RETURN [ ( ] select_stmt [ ) ]
[ ; ]
参数
schema_name
用户定义函数所属的架构的名称。
function_name
用户定义的函数的名称。 函数名称必须遵循标识符规则,并在数据库及其模式中保持唯一。
注意
即使不指定参数,函数名后也必须加上括号。
@parameter_name
用户定义函数中的参数。 你可以声明一个或多个参数。
一个函数最多可包含2100个参数。 当用户或应用程序调用函数时,除非该参数有默认值,否则必须提供每个声明参数的值。
通过将 at 符号 (@) 用作第一个字符来指定参数名称。 参数名称必须遵循标识符的规则。 参数是函数的局部变量;你可以在其他函数中使用相同的参数名称。 参数只能替代常数;它们不能替代表名、列名或其他数据库对象的名称。
注意
ANSI_WARNINGS 在存储过程、用户定义函数中传递参数或在 Batch 语句中声明和设置变量时,不遵循。 例如,如果你定义一个变量为 char(3),然后将其设置为大于三个字符的值,数据就会被截断到定义大小,SQL 语句就会成功。
parameter_data_type
参数数据类型。 对于 Transact-SQL 函数,允许 所有标量数据类型 。
[ = 默认 ]
参数的默认值。 如果你定义了一个 默认 值,就可以在不指定该参数值的情况下执行函数。
当函数的参数有默认值时,调用该函数时必须指定关键字 DEFAULT 以获取默认值。 此行为与在存储过程中使用具有默认值的参数不同,在后一种情况下,不提供参数同样意味着使用默认值。
return_data_type
标量用户定义函数的返回值。
对于 Fabric 数据仓库中的函数,除 rowversion/时间戳外,允许所有数据类型。 非标量类型如 表格 不被允许。
function_body
一系列 Transact-SQL 语句。
在标量函数中, function_body 是一系列 Transact-SQL 语句,它们共同计算为标量值,其中包括:
- 单语句表达式
- 多语句表达式(
IF/THEN/ELSE和BEGIN/END块) - 局部变量
- 对可用的内置 SQL 函数的调用
- 调用其他 UDF
-
SELECT语句和对表、视图和内联表值函数的引用 - 控制流程语句(
WHILE循环,RETURNS)
scalar_expression
指定标量函数返回的标量值。
select_stmt
定义内联表值函数的返回值的单个 SELECT 语句。 对于内联表值函数,没有函数主体;该表是单个 SELECT 语句的结果集。
TABLE
指定表值函数 (TVF) 的返回值为表。 你只能把常量和@local_variables 传递给TVF。
在内联TVF(预览)中,你通过一个TABLE语句定义SELECT返回值。 内联函数没有关联的 return 变量。
<function_option>
在Fabric Data Warehouse中,INLINE不支持、 ENCRYPTION和 EXECUTE AS 关键词。
支持的功能选项包括:
SCHEMABINDING
指定将函数绑定到其引用的数据库对象。 当你指定 SCHEMABINDING时,你无法修改底层对象(例如视图或表),从而影响函数定义。 你必须先修改或放弃函数定义,以消除对你想修改对象的依赖。
只有发生下列操作之一时,才会删除函数与其引用对象的绑定:
你去掉这个函数。
你
ALTER输入函数语句并移除选项SCHEMABINDING。
只有当满足以下条件时,函数才能进行模式绑定:
该函数引用的任何用户自定义函数也是模式绑定的。
该函数通过使用两部分名称来引用对象。
在UDF正体中,你只能引用同一数据库中的内置函数和其他UDF。
执行该
CREATE FUNCTION语句的用户对该函数引用的数据库对象拥有REFERENCES权限。
若要删除 SCHEMABINDING,请使用 ALTER。
RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT
指定 OnNULLCall 标量值函数的属性。 如果你不指定这个属性,默认 CALLED ON NULL INPUT 是隐含的,即使 作为参数传递,函数 body也会 NULL 执行。
最佳做法
如果你没有创建带有schemabinding的用户自定义函数,底层对象的更改可能会影响函数的定义,并在调用该函数时引发意想不到的结果。 当你指定
WITH SCHEMABINDING创建函数的时间时,你确保后续对底层对象的更改不会改变或破坏函数的行为。把用户自定义函数写成可内嵌的。 更多信息请参见标量UDF的内联。
互操作性
内联表值用户定义函数
内联表值函数只接受一个 SELECT 语句。
标量用户定义函数
下列语句在标量值函数中有效:
- 赋值语句。
- 除了和
TRY...CATCH语句外,流量控制语句GO..TO。 -
DECLARE定义局部数据变量的语句。 - 引用表/视图/iTVFs/其他标量UDF。
标量值函数正文不支持以下内置函数:
限制
注意
在当前预览期间,限制可能会更改。
你不能用用户自定义函数来执行修改数据库状态的操作。
你可以嵌套用户自定义函数。 也就是说,一个用户定义的函数可以调用另一个函数。 当被调用函数开始执行时,嵌套级别递增;当被调用函数完成执行时递减。 在Fabric Data Warehouse中,当UDF主体引用表、视图或内联表值函数时,用户可以嵌套最多四层,否则最多可嵌套32层。 如果超过最大嵌套级别,调用函数链就会失败。
在以下情况下,不能在用户表的查询中使用
SELECT ... FROM标量 UDF:- UDF主体包含对非确定性内置函数的调用(例如
GETDATE()),参见 确定性和非确定性函数。 - UDF主体包含
BREAK或CONTINUE语句。 - 存在递归标量UDF调用。
- UDF主体包含对非确定性内置函数的调用(例如
标量UDF无法用于所有查询形状,如CTE和
GROUP BY当:如果标量UDF包含以下任一情况,且单个查询中调用超过10次UDF可能失败:
- 标量UDF主体包含对表/视图/iTVF或其他标量UDF的引用。
- 标量UDF包含以下任意数据类型,作为输入参数、局部变量或返回数据类型:varchar(max)、nvarchar(max)、varbinary(max)、binary(max)。
- 标量 UDF 体包含对 AI 函数的调用。
当标量UDF在任何不支持的场景中使用时,查询执行时会显示错误信息“
Scalar UDF execution is currently unavailable in this context.”。
元数据
本部分列出可用于返回与用户定义函数有关的元数据的系统目录视图。
sys.sql_modules:显示 Transact-SQL 用户自定义函数的定义以及可线性信息。 例如:
SELECT SCHEMA_NAME(o.schema_id) AS SchemaName, o.name AS FunctionName, m.definition AS FunctionDefinition, m.is_inlineable AS Inlineable, m.inline_eligibility_mask AS InlineEligibilityMask FROM sys.objects o JOIN sys.sql_modules m ON o.object_id = m.object_id WHERE o.type = 'FN';sys.parameters:显示有关用户定义的函数中定义的参数的信息。
sys.sql_expression_dependencies:显示函数引用的基础对象。
权限
Fabric 工作区管理员、成员和参与者角色的成员可以创建函数。
标量UDF的内联
Microsoft Fabric Data Warehouse 采用不同的内联技术,以分布式方式编译和执行用户定义的代码。
标量UDF的内联默认是启用的。
某些 T-SQL 语法使标量 UDF 不可内联。 例如,包含循环组合 WHILE 并引用 UDF 正体内表的函数是无法内联的。
检查是否可以内联标量 UDF
目录 sys.sql_modules 视图包括该列,该列 is_inlineable指示 UDF 是否可内联。 该 is_inlineable 属性来自于检查UDF定义中的语法。 标量UDF在编译前不会内联。
该 inline_eligibility_mask 特性说明了适用于UDF的哪种内嵌方式。
- 值 表示
0UDF 不是线成的。 - 值 表示
1UDF 有资格进行 标量 UDF 内联。 - 值 表示
2UDF 有资格通过表达块内嵌。 - 值
3表示UDF符合任一内联技术的资格。
如果标量UDF是可内线化的,它并不保证在编译查询时它总是内联的。
Fabric Data Warehouse根据查询决定应用哪种内联技术。
使用以下示例查询检查标量 UDF 是否可内联:
SELECT
SCHEMA_NAME(b.schema_id) as function_schema_name,
b.name as function_name,
b.type_desc as function_type,
a.is_inlineable
FROM sys.sql_modules AS a
INNER JOIN sys.objects AS b
ON a.object_id = b.object_id
WHERE b.type IN ('FN');
如果标量函数在 中 sys.sql_modules.is_inlineable不可列化,你仍然可以作为独立调用执行查询,例如设置变量。 但标量函数不能作为用户表查询的一部分 SELECT ... FROM 。 例如:
CREATE FUNCTION [dbo].[custom_SYSUTCDATETIME]()
RETURNS datetime2(6)
AS
BEGIN
RETURN SYSUTCDATETIME();
END
dbo.custom_SYSUTCDATETIME由于使用非行列式系统函数,SYSUTCDATETIME()样本标量用户定义函数不可线化。 在 SELECT ... FROM 用户表查询中使用时失败,但作为独立调用则成功。 例如:
DECLARE @utcdate datetime2(7);
SET @utcdate = dbo.custom_SYSUTCDATETIME();
SELECT @utcdate as 'utc_date';
例子
答: 创建内联表值函数
以下示例创建了一个内联表值函数,通过参数过滤 objectType 模块的关键信息。 它默认在调用带 DEFAULT 参数的函数时返回所有模块。 本示例使用了 元数据中提到的一些系统目录视图。
CREATE FUNCTION dbo.ModulesByType (@objectType CHAR(2) = '%%')
RETURNS TABLE
AS
RETURN (
SELECT sm.object_id AS 'Object Id',
o.create_date AS 'Date Created',
OBJECT_NAME(sm.object_id) AS 'Name',
o.type AS 'Type',
o.type_desc AS 'Type Description',
sm.DEFINITION AS 'Module Description',
sm.is_inlineable AS 'Inlineable'
FROM sys.sql_modules AS sm
INNER JOIN sys.objects AS o ON sm.object_id = o.object_id
WHERE o.type LIKE '%' + @objectType + '%'
);
GO
调用返回所有内联表值函数的函数(IF):
SELECT * FROM dbo.ModulesByType('IF'); -- SQL_INLINE_TABLE_VALUED_FUNCTION
或者,查找所有标量函数(FN):
SELECT * FROM dbo.ModulesByType('FN'); -- SQL_SCALAR_FUNCTION
B. 合并内联表值函数的结果
这个简单的例子使用了之前创建的内联TVF,演示了如何通过使用 CROSS APPLY。 在这里,你从两sys.objects列中选择所有列ModulesByType,并对该列中匹配的所有行选择结果type。 关于如何使用 APPLY的更多信息,请参见 FROM 子句加 JOIN, APPLY, PIVOT (Transact-SQL)
SELECT *
FROM sys.objects AS o
CROSS APPLY dbo.ModulesByType(o.type);
GO
C. 创建标量 UDF 函数
以下示例创建一个可嵌入标量 UDF,用于屏蔽输入文本。
CREATE OR ALTER FUNCTION [dbo].[cleanInput] (@InputString VARCHAR(100))
RETURNS VARCHAR(50)
AS
BEGIN
DECLARE @Result VARCHAR(50)
DECLARE @CleanedInput VARCHAR(50)
-- Trim whitespace
SET @CleanedInput = LTRIM(RTRIM(@InputString))
-- Handle empty or null input
IF @CleanedInput = '' OR @CleanedInput IS NULL
BEGIN
SET @Result = ''
END
ELSE IF LEN(@CleanedInput) <= 2
BEGIN
-- If string length is 1 or 2, just return the cleaned string
SET @Result = @CleanedInput
END
ELSE
BEGIN
-- Construct the masked string
SET @Result =
LEFT(@CleanedInput, 1) +
REPLICATE('*', LEN(@CleanedInput) - 2) +
RIGHT(@CleanedInput, 1)
END
RETURN @Result
END
可以调用如下所示的函数:
DECLARE @input varchar(100) = '123456789'
SELECT dbo.cleanInput (@input) AS function_output;
有关如何在 Fabric 数据仓库中使用标量 UDF 的更多示例:
SELECT在语句中:
SELECT TOP 10
t.id, t.name,
dbo.cleanInput (t.name) AS function_output
FROM dbo.MyTable AS t;
WHERE在子句中:
SELECT t.id, t.name, dbo.cleanInput(t.name) AS function_output
FROM dbo.MyTable AS t
WHERE dbo.cleanInput(t.name)='myvalue'
JOIN在子句中:
SELECT t1.id, t1.name,
dbo.cleanInput (t1.name) AS function_output,
dbo.cleanInput (t2.name) AS function_output_2
FROM dbo.MyTable1 AS t1
INNER JOIN dbo.MyTable2 AS t2
ON dbo.cleanInput(t1.name)=dbo.cleanInput(t2.name);
ORDER BY在子句中:
SELECT t.id, t.name, dbo.cleanInput (t.name) AS function_output
FROM dbo.MyTable AS t
ORDER BY function_output;
在数据作语言(DML)语句中,例如 INSERT, UPDATE或 DELETE:
SELECT t.id, t.name, dbo.cleanInput (t.name) AS function_output
INTO dbo.MyTable_new
FROM dbo.MyTable AS t;
UPDATE t
SET t.mycolumn_new = dbo.cleanInput (t.name)
FROM dbo.MyTable AS t;
DELETE t
FROM dbo.MyTable AS t
WHERE dbo.cleanInput (t.name) ='myvalue';
相关内容
适用于:Azure Synapse Analytics
分析平台系统 (PDW)
在 Azure Synapse Analytics 或 Analytics 平台系统(PDW)中创建用户定义的函数(UDF)。 用户定义函数是接受参数、执行操作(例如复杂计算)并将操作结果以值的形式返回的 Transact-SQL 例程。 用户定义表值函数 (TVF) 返回 table 数据类型。
小窍门
关于Fabric Data Warehouse语法,请参见 for CREATE FUNCTION for Fabric Data Warehouse 的版本。
在 Analytics Platform System (PDW) 中,返回值必须是标量(单个)值。
在 Azure Synapse Analytics 中,
CREATE FUNCTION可以使用内联表值函数(预览)的语法返回表,也可以通过使用标量函数的语法返回单个值。在 Azure Synapse Analytics 中的无服务器 SQL 池中,可以创建内联表值函数,
CREATE FUNCTION但不能创建标量函数。使用这句话创建一个可重复使用的例程,你可以以下方式使用:
在 Transact-SQL 语句中,例如
SELECT在调用函数
在另一个用户定义函数的定义中
用于为列定义 CHECK 约束
用于替换存储过程
使用内联函数作为安全策略的筛选器谓词
语法
标量函数语法
-- Transact-SQL Scalar Function Syntax (in dedicated pools in Azure Synapse Analytics and Parallel Data Warehouse)
-- Not available in the serverless SQL pools in Azure Synapse Analytics
CREATE FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] parameter_data_type
[ = default ] }
[ ,...n ]
]
)
RETURNS return_data_type
[ WITH <function_option> [ ,...n ] ]
[ AS ]
BEGIN
function_body
RETURN scalar_expression
END
[ ; ]
<function_option>::=
{
[ SCHEMABINDING ]
| [ RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ]
}
内联表值函数语法
-- Transact-SQL Inline Table-Valued Function Syntax
-- Preview in dedicated SQL pools in Azure Synapse Analytics
-- Available in the serverless SQL pools in Azure Synapse Analytics
CREATE FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] parameter_data_type
[ = default ] }
[ ,...n ]
]
)
RETURNS TABLE
[ WITH SCHEMABINDING ]
[ AS ]
RETURN [ ( ] select_stmt [ ) ]
[ ; ]
参数
schema_name
用户定义函数所属的架构的名称。
function_name
用户定义的函数的名称。 函数名称必须遵循标识符规则,并在数据库及其模式中保持唯一。
注意
即使不指定参数,函数名后也必须加上括号。
@parameter_name
用户定义函数中的参数。 你可以声明一个或多个参数。
一个函数最多可包含2100个参数。 当用户或应用程序调用函数时,除非该参数有默认值,否则必须提供每个声明参数的值。
通过将 at 符号 (@) 用作第一个字符来指定参数名称。 参数名称必须遵循标识符的规则。 参数是函数的局部变量;你可以在其他函数中使用相同的参数名称。 参数只能替代常数;它们不能替代表名、列名或其他数据库对象的名称。
注意
ANSI_WARNINGS 在存储过程、用户定义函数中传递参数或在 Batch 语句中声明和设置变量时,不遵循。 例如,如果你定义一个变量为char(3),然后将其设置为大于三个字符的值,数据会被截断到定义大小,或者INSERTUPDATE语句成功。
parameter_data_type
参数数据类型。 对于 Transact-SQL 函数,允许在 Azure Synapse Analytics 中支持所有标量数据类型。 时间戳(行版本)数据类型不支持。
[ = 默认 ]
参数的默认值。 如果你定义了一个 默认 值,就可以在不指定该参数值的情况下执行函数。
当函数的参数有默认值时,调用该函数时必须指定关键字 DEFAULT 以获取默认值。 此行为与在存储过程中使用具有默认值的参数不同,在后一种情况下,不提供参数同样意味着使用默认值。
return_data_type
标量用户定义函数的返回值。 对于 Transact-SQL 函数,允许在 Azure Synapse Analytics 中支持所有标量数据类型。 行版本/时间戳数据类型不支持。 光标和表非标量类型不被允许。
function_body
Transact-SQL 语句系列。
function_body不能包含SELECT语句,也不能引用数据库数据。
function_body不能引用表或视图。 函数体可以调用其他确定性函数,但不能调用非确定性函数。
在标量函数中,function_body 是一系列 Transact-SQL 语句,这些语句一起使用可计算出标量值。
scalar_expression
指定标量函数返回的标量值。
select_stmt
定义内联表值函数的返回值的单个 SELECT 语句。 对于内联表值函数,没有函数主体;该表是单个 SELECT 语句的结果集。
TABLE
指定表值函数 (TVF) 的返回值为表。 你只能把常量和@local_variables 传递给TVF。
在内联TVF(预览)中,你通过一个TABLE语句定义SELECT返回值。 内联函数没有关联的 return 变量。
<function_option>
指定函数具有以下一个或多个选项。
SCHEMABINDING
指定将函数绑定到其引用的数据库对象。 当你指定 SCHEMABINDING时,你无法修改底层对象(例如视图或表),从而影响函数定义。 你必须先修改或放弃函数定义,以消除对你想修改对象的依赖。
只有发生下列操作之一时,才会删除函数与其引用对象的绑定:
你去掉这个函数。
你
ALTER输入函数语句并移除选项SCHEMABINDING。
只有当满足以下条件时,函数才能进行模式绑定:
该函数引用的任何用户自定义函数也是模式绑定的。
函数引用使用单部分或两部分名称。
在UDF正体中,你只能引用同一数据库中的内置函数和其他UDF。
执行该
CREATE FUNCTION语句的用户对该函数引用的数据库对象拥有REFERENCES权限。
若要删除 SCHEMABINDING,请使用 ALTER。
RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT
指定 OnNULLCall 标量值函数的属性。 如果你不指定这个属性,默认 CALLED ON NULL INPUT 是隐含的,即使 作为参数传递,函数 body也会 NULL 执行。
最佳做法
如果你没有创建带有 SCHEMABINDING 子句的用户自定义函数,底层对象的更改会影响函数的定义,并在调用时引发意想不到的结果。 创建函数时指定子句。WITH SCHEMABINDING 这个子句确保你不能修改函数定义中引用的对象,除非你也修改了函数。
互操作性
下列语句在标量值函数中有效:
赋值语句。
Control-of-Flow 语句,除了 TRY...CATCH声明。
DECLARE 语句定义本地数据变量。
在内联表值函数(预览)中,你只能使用一个选择语句。
限制
你不能用用户自定义函数来执行修改数据库状态的操作。
你可以嵌套用户自定义函数。 一个用户自定义函数可以调用另一个。 当被调用函数开始执行时,嵌套级别递增;当被调用函数完成执行时递减。 如果超过最大嵌套级别,整个调用函数链就会失败。
你不能在 Azure Synapse Analytics 的master无服务器 SQL 池数据库中创建对象,包括函数。
元数据
本部分列出可用于返回与用户定义函数有关的元数据的系统目录视图。
sys.sql_modules:显示 Transact-SQL 用户定义函数的定义。 例如:
SELECT definition, type FROM sys.sql_modules AS m JOIN sys.objects AS o ON m.object_id = o.object_id AND type = ('FN');sys.parameters:显示有关用户定义的函数中定义的参数的信息。
sys.sql_expression_dependencies:显示函数引用的基础对象。
权限
需要在数据库中获得权限,并且需要 CREATE FUNCTION 对创建该函数的模式获得 ALTER 权限。
例子
答: 使用标量值用户定义函数更改数据类型
这个简单的函数以 整数 数据类型为输入,输出为十 进制(10,2) 数据类型。
CREATE FUNCTION dbo.ConvertInput (@MyValueIn int)
RETURNS decimal(10,2)
AS
BEGIN
DECLARE @MyValueOut int;
SET @MyValueOut= CAST( @MyValueIn AS decimal(10,2));
RETURN(@MyValueOut);
END;
GO
SELECT dbo.ConvertInput(15) AS 'ConvertedValue';
注意
标量函数在无服务器SQL池中没有。
B. 创建内联表值函数
以下示例创建了一个内联表值函数,通过参数过滤 objectType 模块的关键信息。 它默认在调用带 DEFAULT 参数的函数时返回所有模块。 本示例使用了 元数据中提到的一些系统目录视图。
CREATE FUNCTION dbo.ModulesByType(@objectType CHAR(2) = '%%')
RETURNS TABLE
AS
RETURN
(
SELECT
sm.object_id AS 'Object Id',
o.create_date AS 'Date Created',
OBJECT_NAME(sm.object_id) AS 'Name',
o.type AS 'Type',
o.type_desc AS 'Type Description',
sm.definition AS 'Module Description'
FROM sys.sql_modules AS sm
JOIN sys.objects AS o ON sm.object_id = o.object_id
WHERE o.type like '%' + @objectType + '%'
);
GO
你可以调用返回所有视图(V)对象的函数:
select * from dbo.ModulesByType('V');
注意
内联表值函数可在无服务器的 SQL 池中使用,但在专用 SQL 池中处于预览阶段。
C. 合并内联表值函数的结果
这个简单的例子使用了之前创建的内联TVF,演示了如何通过使用 CROSS APPLY。 在这个例子中,你从两列sys.objects中选择所有列,并对该列上匹配ModulesByType的所有行选择结果type。 关于如何使用 APPLY的更多信息,请参见 FROM 子句加 JOIN, APPLY, PIVOT (Transact-SQL)
SELECT *
FROM sys.objects o
CROSS APPLY dbo.ModulesByType(o.type);
GO
注意
内联表值函数可在无服务器的 SQL 池中使用,但在专用 SQL 池中处于预览阶段。