3

当我第一次运行以下功能时,以下功能将失败,并出现以下错误:

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

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

如果我删除*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 没有任何问题。

4

1 回答 1

4

SQL Server 2019 仍在 CTP 中,这是一项新功能。如果您发现其中的错误,您应该将其报告给 Microsoft,以便在发布之前修复它(在此处为您完成)。(编辑此错误现在已被标记为已修复,大概在 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)

在 Microsoft 修复此内联案例之前,您可以使用

WITH INLINE = OFF

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

于 2019-03-06T16:24:29.757 回答