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 server2019时,到最后提示服务没有及时响应启动或控制请求,怎么办?