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

#sql-server #tsql #user-defined-functions #sql-server-2019

#sql-сервер #tsql #определяемые пользователем функции #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 без каких-либо проблем.

Комментарии:

1. sys.sql_modules: inline_type=1 is_inlineable=1

Ответ №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

Комментарии:

1. Спасибо. Я проголосовал за ваше сообщение об ошибке. Мы обновим наш сервер 2008R2, и встраивание скалярного UDF является основной причиной перехода на версию 2019, когда она будет готова. Эта проблема влияет на многие наши функции, поэтому я надеюсь, что они исправят это, чтобы мы могли получить прирост производительности.

2. @arildh — да, я не знаю, будет ли исправление заключаться в том, чтобы просто не встроить функции с этой проблемой или изменить поведение этой группы, разрешив смешивать внутренние и внешние ссылки в агрегировании, чтобы получить ту же семантику, что и при не встроенных. Надеюсь, второе, но я подозреваю, что это может быть первое 🙁

3. Все еще присутствует в CTP 2.5.

4. CU2 для MS SQL Server 2019 решил эту проблему