MS SQL 2019 中 UDF 内的意外 @@rowcount 行为
Unexpected @@rowcount behavior inside an UDF in MS SQL 2019
这是我的示例代码
drop function rowcount_test
go
CREATE FUNCTION dbo.rowcount_test () RETURNS INT AS
BEGIN
DECLARE @v INT
SELECT @v = 1
return @@ROWCOUNT
END
GO
grant exec on dbo.rowcount_test to public
go
SELECT dbo.rowcount_test()
mssql 2017(及更早版本)执行时返回 1
mssql 2019执行时返回0
在 mssql 2019(标准版)执行时给出 1,数据库设置为 2017 兼容模式
以前从来没有出现过问题...这是一种影响代码的设置还是MSSQL 2019中的一种错误?
标量 udf 再次内联,相当有问题
SELECT dbo.rowcount_test()
OPTION (USE HINT('DISABLE_TSQL_SCALAR_UDF_INLINING'));
现在应该修复了。
https://support.microsoft.com/en-us/help/4538581/fix-scalar-udf-inlining-issues-in-sql-server-2019
This cumulative update also blocks Inlining in the following scenarios:
- If the UDF references certain intrinsic functions (e.g. @@ROWCOUNT) that may alter the results when Inlined
这是我的示例代码
drop function rowcount_test
go
CREATE FUNCTION dbo.rowcount_test () RETURNS INT AS
BEGIN
DECLARE @v INT
SELECT @v = 1
return @@ROWCOUNT
END
GO
grant exec on dbo.rowcount_test to public
go
SELECT dbo.rowcount_test()
mssql 2017(及更早版本)执行时返回 1
mssql 2019执行时返回0
在 mssql 2019(标准版)执行时给出 1,数据库设置为 2017 兼容模式
以前从来没有出现过问题...这是一种影响代码的设置还是MSSQL 2019中的一种错误?
标量 udf 再次内联,相当有问题
SELECT dbo.rowcount_test()
OPTION (USE HINT('DISABLE_TSQL_SCALAR_UDF_INLINING'));
现在应该修复了。
https://support.microsoft.com/en-us/help/4538581/fix-scalar-udf-inlining-issues-in-sql-server-2019
This cumulative update also blocks Inlining in the following scenarios:
- If the UDF references certain intrinsic functions (e.g. @@ROWCOUNT) that may alter the results when Inlined