内联标量函数:真实还是蒸发器?

时间:2012-05-03 14:14:02

标签: sql sql-server tsql user-defined-functions

在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'。

我是否遗漏了某些内容或联机丛书中是否有错误?

4 个答案:

答案 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