在SQL Server中创建内联标量函数的正确语法是什么?
Online Online,在Types of Functions章节(2005及以上)中,讨论了内联标量函数,就好像它们存在一样,并且好像不需要BEGIN...END
块(与多行函数相比):< / p>
对于内联标量函数,没有函数体;标量 value是单个语句的结果。对于多语句标量函数,在BEGIN ... END块中定义的函数体包含一系列返回单个值的Transact-SQL语句。
我还注意到spt_values表中对象类型列表中“IS:inline scalar function”的行:
SELECT name
FROM master..spt_values
WHERE type = 'O9T'
AND name LIKE '%function%'
我试图创建这样一个功能但没有成功:
CREATE FUNCTION AddOne(@n int) RETURNS int
AS
RETURN @n + 1
错误消息是
Msg 102,Level 15,State 31,Procedure AddOne,Line 3语法不正确 靠近'RETURN'。
我是否遗漏了某些内容或联机丛书中是否有错误?
答案 0 :(得分:9)
嗯,AFAIK,都不存在(甚至在隐藏的[ mssqlsystemresource ]数据库中也没有)并且没有创建语法的语法。所以看来这是微软必须通过为它添加一个类型(和doc!)来预测SQL Server 2005的预期,但是由于某种原因从未真正实现过。
虽然它是所有Ms Sql Server所需的最多功能之一。主要是因为默认的UDF是如此之慢,我们最终不得不后端ITVF来获得相同的效果。 (困难和笨拙,但它的确有效)。
答案 1 :(得分:2)
正确,没有内联标量函数。可以使用内联TVF“模拟”一个,但是,任何“客户”的语法都需要改变。 1)创造他的功能:
create function dbo.AddOne(@input int) returns table as return (select @input + 1 as value);
2)在“客户端”代码中,执行此操作...
(select value from dbo.AddOne(Column)) as ColumnPlusOne
现在你有一个正常运行的内联标量函数。
我必须这样做才能在我看起来像这样的客户端代码中替换很多标量UDF ...
create function dbo.GetLookupID(@code varchar(50)) returns int
as
begin
declare @return int;
select @return = LookupID from dbo.Lookups where Code = @code;
return @return;
end;
我尝试通过删除变量来修复它......
create function dbo.GetLookupID(@code varchar(50)) returns int
as
begin
return (select LookupID from dbo.Lookups where Code = @code);
end;
这是一个改进,然而,仍然有令人不快的表现。当我改为iTVF并改变了召唤惯例......它变得更好了。
答案 2 :(得分:1)
我看到了同样的事情。这句话似乎是“内联标量函数”的唯一参考。 This article声称内联表值函数可以足够快地完成工作。
答案 3 :(得分:1)
从SQL Server 2019 CTP2.1开始,有一个名为“标量UDF内联”的新功能,当满足某些先决条件时,该功能可以自动内联标量UDF。
介绍此功能的官方博客文章位于:https://blogs.msdn.microsoft.com/sqlserverstorageengine/2018/11/07/introducing-scalar-udf-inlining/
描述此功能的详细文档在这里: https://docs.microsoft.com/en-us/sql/relational-databases/user-defined-functions/scalar-udf-inlining?view=azuresqldb-current