SQL Server中能否在内联表值函数中调用用户自定义标量函数?
问题解答:SQL Server内联表值函数是否支持调用用户自定义标量函数
结论是完全支持,这属于SQL Server原生支持的语法,没有强制使用限制。
语法示例
首先创建测试用自定义标量函数:
-- 示例标量函数:计算商品对应税费 CREATE FUNCTION dbo.CalculateTax(@Price DECIMAL(10,2), @TaxRate DECIMAL(5,2)) RETURNS DECIMAL(10,2) AS BEGIN RETURN @Price * @TaxRate / 100 END
再创建调用上述标量函数的内联表值函数:
-- 示例内联表值函数,内部直接调用自定义标量函数 CREATE FUNCTION dbo.GetProductPricing(@CategoryId INT, @TaxRate DECIMAL(5,2)) RETURNS TABLE AS RETURN ( SELECT ProductId, ProductName, Price, dbo.CalculateTax(Price, @TaxRate) AS TaxAmount, -- 调用自定义标量函数 Price + dbo.CalculateTax(Price, @TaxRate) AS FinalPrice FROM Products WHERE CategoryId = @CategoryId )
注意事项
- 性能风险:SQL Server 2017及更早版本,自定义标量函数默认不会被查询优化器内联展开,会逐行调用执行,会大幅降低内联表值函数的查询效率,数据量大时性能衰减尤其明显。
- 新版本优化:SQL Server 2019及以上版本,将数据库兼容级别设置为150及以上后,符合内联条件的标量函数会被自动展开,不会产生额外性能开销。
- 若要最大化查询性能,建议优先把标量函数的逻辑直接写在内联表值函数的查询语句中,避免不必要的函数嵌套。
内容的提问来源于stack exchange,提问作者Chirag Patelia
相关产品推荐
相关产品推荐

