19

在 SQL Server中创建内联标量函数的正确语法是什么?

Books Online,在Types of Functions章节(2005 年及以上)中,讨论了内联标量函数,就好像它们存在并且好像不需要BEGIN...END块(与多行函数相比):

对于内联标量函数,没有函数体;标量值是单个语句的结果。对于多语句标量函数,在 BEGIN...END 块中定义的函数体包含一系列返回单个值的 Transact-SQL 语句。

我还注意到spt_values 表的对象类型列表中有一行“IS:内联标量函数” :

SELECT name
FROM master..spt_values
WHERE type = 'O9T'
AND name LIKE '%function%'

我试图创建这样的功能但没有成功:

CREATE FUNCTION AddOne(@n int) RETURNS int
AS
    RETURN @n + 1

错误信息是

消息 102,级别 15,状态 31,过程 AddOne,第 3 行“返回”附近的语法不正确。

是我遗漏了什么还是联机丛书中有错误?

4

4 回答 4

11

好吧,AFAIK,不存在(甚至在隐藏的 [ mssqlsystemresource ] 数据库中也不存在),并且没有创建语法的语法。因此,这似乎是微软在 SQL Server 2005 的准备阶段通过为其添加类型(和文档!)而预期的东西,但由于某种原因从未真正实现过。

尽管它是所有 Ms Sql Server 最需要的功能之一。主要是因为默认的 UDF 太慢了,我们最终不得不后端 ITVF 来获得相同的效果。(困难且笨拙,但它有效)。

于 2012-05-03T14:53:36.273 回答
4

正确,没有内联标量函数这样的东西。可以通过使用内联 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 并更改调用约定时……它变得更好了。

于 2018-01-02T18:36:02.483 回答
4

从 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

于 2018-12-05T18:12:01.777 回答
1

我看到同样的事情。这句话似乎是对“内联标量函数”的唯一引用。本文声称内联表值函数可以足够快地完成这项工作。

于 2012-05-03T14:43:29.023 回答