【问题标题】:SQL Server 2016 vs 2019 functionsSQL Server 2016 与 2019 函数
【发布时间】: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 inlininginterleaved execution,其中描述了为什么会发生这些行为变化,以及如果您无法将现有代码更改为更合理,如何针对整个数据库或每个查询进行调整(后者应该是首选,因为这些优化通常是好事)。
  • 我使用这个查询只是为了解释我的问题,当你没有任何结果时会发生什么。在生产中我没有使用它。

标签: sql-server sql-server-2016 sql-server-2019


【解决方案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

【讨论】:

    猜你喜欢
    • 2020-03-31
    • 1970-01-01
    • 2017-02-11
    • 2020-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-09
    • 1970-01-01
    相关资源
    最近更新 更多