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