SQL Server 2016 与 2019 函数

Posted

技术标签:

【中文标题】SQL Server 2016 与 2019 函数【英文标题】:SQL Server 2016 vs 2019 functions 【发布时间】:2020-01-10 15:39:33 【问题描述】:

从 SQL Server 2016 到版本 2019 的功能发生了一些变化。

这是测试函数:

create function [dbo].[TestFunction]
(
    @input uniqueidentifier
)
returns uniqueidentifier
as
begin
    select top 0 @input = id from randomTable;

    return
    (
        select  @input
    )
end

如果我在 SQL Server 2016 中尝试此代码,结果是输入值,但在 SQL Server 2019 中,结果为 null。

谁能指出正确的方向发生了什么变化?

【问题讨论】:

猜测这是由于 SQL Server 2019 中引入的内联功能。为什么你会这样的查询呢? TOP (0) 有什么用途?这感觉像是一个问题,虽然很有趣,但不是问题;因为为什么你需要前 0 行? @Larnu This answer explains a couple of scenarios for using TOP 0,虽然我不太确定你为什么要尝试在同一个查询中进行变量赋值 是的,将它与UNION ALL 一起使用是有意义的@Diado;虽然我认为它只是在正确的地方混叠是一种奇怪的工作。但这并不能解释变量,但您也同意这一点。这感觉就像一个非问题。 请参阅 scalar UDF inlining 和 interleaved execution,其中描述了为什么会发生这些行为变化,以及如果您无法将现有代码更改为更合理,如何针对整个数据库或每个查询进行调整(后者应该是首选,因为这些优化通常是好事)。 我使用这个查询只是为了解释我的问题,当你没有任何结果时会发生什么。在生产中我没有使用它。 【参考方案1】:

返回的 NULL 是由于标量 udf 内联:

Unexpected @@rowcount behavior inside an UDF in MS SQL 2019

如果您希望函数利用内联并返回正确的结果,您可以将其重构为:

create function [dbo].[TestFunction]
(
    @input uniqueidentifier
)
returns uniqueidentifier
--WITH INLINE = ON
as
begin
    --select top (0) @input= id from randomTable

    return
    (
        isnull((select top (0) id from randomtable), @input)
    )
end

【讨论】:

以上是关于SQL Server 2016 与 2019 函数的主要内容,如果未能解决你的问题,请参考以下文章

sql server2016怎么转换成2019的格式

oracle 与sql server 部分内置函数替换

SQL Server 内存优化表 - 与临时表相比性能较差

安装数据库sql server2019时,到最后提示服务没有及时响应启动或控制请求,怎么办?

SQL Server 2012/2016/2017 新增函数

SQL Server 2016 JSON原生支持实例说明