SQL Server 2019 中标量 UDF 内联问题

ari*_*ldh 4 t-sql sql-server user-defined-functions sql-server-2019

当我第一次运行下面的函数时,它会失败并出现以下错误:

\n\n
\n

8124(在包含外部引用的聚合表达式中指定了多个列。)

\n
\n\n

第二次运行就正常了。

\n\n

如果我删除*DATEDIFF(D, e.FRADATO , @til) 它\xe2\x80\x99s 没问题。

\n\n
ALTER FUNCTION [dbo].[fnc_2019_test] \n    (@m_id INT, @fra DATE, @til DATE)  \nRETURNS INT\nAS  \nBEGIN \n    RETURN\n        (SELECT     \n             SUM(ISNULL(e.FORBRUK, 0) * DATEDIFF(D, e.FRADATO, @til))\n         FROM \n             dbo.mlr_eos_avl e \n         WHERE  \n             e.M\xc3\x85LER_ID = @m_id   \n             AND @fra < e.DATO \n             AND DATEADD(D, -1, @til) >= e.FRADATO) \n\nEND\n
Run Code Online (Sandbox Code Playgroud)\n\n

该函数在SQL Server 2008 R2和SQL Server 2016中运行没有任何问题。

\n

Mar*_*ith 5

SQL Server 2019 仍处于 CTP 状态,这是一项新功能。如果您发现其中的错误,您应该将其报告给 Microsoft,以便在发布之前修复它(此处已为您完成)。(编辑这个bug现在已经被标记为已修复,大概是在CU6中)

在以前的版本中,如果您尝试手动内联它,您将看到相同的错误(如下面的简化示例所示)。这是因为这里讨论的限制。

WITH T(m_id,fra, til) AS
(
SELECT 1, GETDATE(), GETDATE()
)
SELECT *
FROM T
CROSS APPLY
        (SELECT     
             SUM(DATEDIFF(D, e.FRADATO, til))
         FROM 
             dbo.mlr_eos_avl e 
) CA(result)
Run Code Online (Sandbox Code Playgroud)

在 Microsoft 修复此内联大小写之前,您可以使用

WITH INLINE = OFF
Run Code Online (Sandbox Code Playgroud)

在标量 UDF 定义中禁用 UDF 内联