Проблема со скалярным встраиванием UDF в SQL Server 2019

Приведенная ниже функция завершится ошибкой, когда я запущу ее в первый раз со следующей ошибкой:

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.


person arildh    schedule 06.03.2019    source источник
comment
sys.sql_modules: inline_type=1 is_inlineable=1   -  person arildh    schedule 06.03.2019


Ответы (1)


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

person Martin Smith    schedule 06.03.2019
comment
Спасибо. Я проголосовал за ваш отчет об ошибке. Мы обновим наш сервер 2008R2, и встраивание Scalar UDF — основная причина перейти на версию 2019, когда она будет готова. Эта проблема влияет на многие из наших функций, поэтому я надеюсь, что они исправят ее, чтобы мы могли получить прирост производительности. - person arildh; 07.03.2019
comment
@arildh - да, я не знаю, будет ли исправление просто не встраивать функции с этой проблемой или изменять поведение этой группы, позволяя смешивать внутренние и внешние ссылки в агрегации, чтобы дать ту же семантику, что и когда не встроены . Надеюсь, что второй, но я подозреваю, что может быть и первый :-( - person Martin Smith; 07.03.2019
comment
Еще есть в ОСАГО 2.5. - person arildh; 02.05.2019