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 的内联
下面的函数在我第一次 运行 时会失败,并出现以下错误:
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 的内联