SQL Server 2019 UDF 中的@@ROWCOUNT 错误
Error in @@ROWCOUNT inside SQL Server 2019 UDF
我发现 @@ROWCOUNT
在 MS SQL Server 2019 中的 User Defined Function
中使用时,它不再正常工作。
我不知道这是 MS SQL 错误还是需要的行为更改。
有任何选项可以返回到 2019 之前版本的行为吗?与安装设置有关吗?
这是您自己测试的代码和结果:
CREATE FUNCTION [dbo].[udfScalar](@test NVARCHAR(255)) RETURNS int
AS BEGIN
DECLARE @var AS NVARCHAR(255)
DECLARE @ROWCOUNT AS INT = NULL
select top 1 @var = 'test' from FooTable where 1 = 0
SET @ROWCOUNT = @@ROWCOUNT
RETURN @ROWCOUNT;
END
GO
DECLARE @var AS NVARCHAR(255)
DECLARE @ROWCOUNT AS INT = NULL
select top 1 @var = 'test' from FooTable where 1 = 0
SET @ROWCOUNT = @@ROWCOUNT
select @ROWCOUNT '@@ROWCOUNT in T-SQL', [dbo].[udfScalar]('test') '@@ROWCOUNT in UDF', @@VERSION 'MS SQL VERSION'
drop FUNCTION [dbo].[udfScalar]
MS SQL Server 2019 中的结果(错误):
@@ROWCOUNT in T-SQL: 0
@@ROWCOUNT in UDF: 1
MS SQL VERSION: Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64)
Sep 24 2019 13:48:23
Copyright (C) 2019 Microsoft Corporation
Standard Edition (64-bit) on Windows Server 2019 Standard 10.0 <X64> (Build 17763: ) (Hypervisor)
注意 UDF
returns 1
因为 where 1 = 0
.
结果应该是 0
在 MS SQL Server 2016 和以前版本中的结果(正确):
@@ROWCOUNT in T-SQL: 0
@@ROWCOUNT in UDF: 0
MS SQL VERSION: Microsoft SQL Server 2016 (SP2-GDR) (KB4505220) - 13.0.5101.9 (X64)
Jun 15 2019 23:15:58
Copyright (c) Microsoft Corporation
Standard Edition (64-bit) on Windows Server 2016 Standard 10.0 <X64> (Build 14393: ) (Hypervisor)
现在我无法访问 SQL Server 2017,但我相信它是正确的。
@Larnu 回答正确,这种行为变化是由于标量内联。
添加修饰符 WITH INLINE = OFF
按预期工作。
CREATE FUNCTION [dbo].[udfScalar](@test NVARCHAR(255)) RETURNS int
WITH INLINE = OFF
AS BEGIN
DECLARE @var AS NVARCHAR(255)
DECLARE @ROWCOUNT AS INT = NULL
select top 1 @var = 'test' from FooTable where 1 = 0
SET @ROWCOUNT = @@ROWCOUNT
RETURN @ROWCOUNT;
END
这是一个与 UDF 内联相关的已知错误。 SQL Server 2019 添加了 UDF 内联,以提高 UDF 的性能。
您需要安装从 SQL Server 2019 CU2 开始的最新 CU infact。如果 UDF 包含 @@ROWCOUNT
,则 UDF 将不再内联。
否则,您可以添加选项 WITH INLINE = OFF
.
更多信息:
我发现 @@ROWCOUNT
在 MS SQL Server 2019 中的 User Defined Function
中使用时,它不再正常工作。
我不知道这是 MS SQL 错误还是需要的行为更改。
有任何选项可以返回到 2019 之前版本的行为吗?与安装设置有关吗?
这是您自己测试的代码和结果:
CREATE FUNCTION [dbo].[udfScalar](@test NVARCHAR(255)) RETURNS int
AS BEGIN
DECLARE @var AS NVARCHAR(255)
DECLARE @ROWCOUNT AS INT = NULL
select top 1 @var = 'test' from FooTable where 1 = 0
SET @ROWCOUNT = @@ROWCOUNT
RETURN @ROWCOUNT;
END
GO
DECLARE @var AS NVARCHAR(255)
DECLARE @ROWCOUNT AS INT = NULL
select top 1 @var = 'test' from FooTable where 1 = 0
SET @ROWCOUNT = @@ROWCOUNT
select @ROWCOUNT '@@ROWCOUNT in T-SQL', [dbo].[udfScalar]('test') '@@ROWCOUNT in UDF', @@VERSION 'MS SQL VERSION'
drop FUNCTION [dbo].[udfScalar]
MS SQL Server 2019 中的结果(错误):
@@ROWCOUNT in T-SQL: 0
@@ROWCOUNT in UDF: 1
MS SQL VERSION: Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64)
Sep 24 2019 13:48:23
Copyright (C) 2019 Microsoft Corporation
Standard Edition (64-bit) on Windows Server 2019 Standard 10.0 <X64> (Build 17763: ) (Hypervisor)
注意 UDF
returns 1
因为 where 1 = 0
.
0
在 MS SQL Server 2016 和以前版本中的结果(正确):
@@ROWCOUNT in T-SQL: 0
@@ROWCOUNT in UDF: 0
MS SQL VERSION: Microsoft SQL Server 2016 (SP2-GDR) (KB4505220) - 13.0.5101.9 (X64)
Jun 15 2019 23:15:58
Copyright (c) Microsoft Corporation
Standard Edition (64-bit) on Windows Server 2016 Standard 10.0 <X64> (Build 14393: ) (Hypervisor)
现在我无法访问 SQL Server 2017,但我相信它是正确的。
@Larnu 回答正确,这种行为变化是由于标量内联。
添加修饰符 WITH INLINE = OFF
按预期工作。
CREATE FUNCTION [dbo].[udfScalar](@test NVARCHAR(255)) RETURNS int
WITH INLINE = OFF
AS BEGIN
DECLARE @var AS NVARCHAR(255)
DECLARE @ROWCOUNT AS INT = NULL
select top 1 @var = 'test' from FooTable where 1 = 0
SET @ROWCOUNT = @@ROWCOUNT
RETURN @ROWCOUNT;
END
这是一个与 UDF 内联相关的已知错误。 SQL Server 2019 添加了 UDF 内联,以提高 UDF 的性能。
您需要安装从 SQL Server 2019 CU2 开始的最新 CU infact。如果 UDF 包含 @@ROWCOUNT
,则 UDF 将不再内联。
否则,您可以添加选项 WITH INLINE = OFF
.
更多信息: