SQL Server 2019 中的标量 UDF 内联问题

Problem with scalar UDF inlining in SQL Server 2019

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

8124 (Multiple columns are specified in an aggregated expression containing an outer reference.)

我第二次 运行 正常 运行 了。

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

ALTER FUNCTION [dbo].[fnc_2019_test] 
    (@m_id INT, @fra DATE, @til DATE)  
RETURNS INT
AS  
BEGIN 
    RETURN
        (SELECT     
             SUM(ISNULL(e.FORBRUK, 0) * DATEDIFF(D, e.FRADATO, @til))
         FROM 
             dbo.mlr_eos_avl e 
         WHERE  
             e.MÅLER_ID = @m_id   
             AND @fra < e.DATO 
             AND DATEADD(D, -1, @til) >= e.FRADATO) 

END

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

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

在以前的版本中,如果您尝试手动内联它,您将看到相同的错误(如下面的缩减示例所示)。这是因为 discussed here.

的限制
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)

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

WITH INLINE = OFF

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