MS SQL 2019 中 UDF 内的意外 @@rowcount 行为

pel*_*lod 7 t-sql sql-server rowcount user-defined-functions sql-server-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()
Run Code Online (Sandbox Code Playgroud)

由 mssql 2017(及更早版本)执行时,它给出 1

由 mssql 2019 执行时它给出 0

它在 mssql 2019(标准版)执行时给出 1,并将 db 置于 2017 兼容模式

以前从来没出过问题……是MSSQL 2019中的某种影响代码的设置还是某种bug?

lpt*_*ptr 6

标量 udf 再次内联,相当有问题

SELECT dbo.rowcount_test()

OPTION (USE HINT('DISABLE_TSQL_SCALAR_UDF_INLINING'));
Run Code Online (Sandbox Code Playgroud)

  • 这是否是“错误”是有争议的,但它*是*[记录](https://docs.microsoft.com/sql/relational-databases/user-definition-functions/scalar-udf-inlined),并且因此可能是设计使然。“如果 UDF 引用诸如`SCOPE_IDENTITY()`、`@@ROWCOUNT`或`@@ERROR`之类的内置函数,则内置函数返回的值将随着内联而改变。这种行为变化是因为内联改变了 UDF 内语句的范围。” 他们提供了大量的旋钮来调整内联(包括为整个数据库关闭它),所以这不是一个主要问题。 (4认同)
  • 对于任何对此投反对票的人:很容易验证[答案是否正确](https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=58c785cc8e59d1d037368fc50011b749)。通过注释掉“OPTION”来比较有内联和没有内联的执行计划。 (2认同)