Функции SQL Server 2016 и 2019

Что-то изменилось в функциях от SQL Server 2016 до версии 2019.

Это тестовая функция:

create function [dbo].[TestFunction]
(
    @input uniqueidentifier
)
returns uniqueidentifier
as
begin
    select top 0 @input = id from randomTable;

    return
    (
        select  @input
    )
end

Если я попробую этот код в SQL Server 2016, результатом будет входное значение, но в SQL Server 2019 результат будет нулевым.

Может ли кто-нибудь указать мне правильное направление, что изменилось?


person Nihad    schedule 10.01.2020    source источник
comment
Предположительно, это связано с функцией встраивания, представленной в SQL Server 2019. Зачем вам иметь такой запрос? Какой цели служит TOP (0)? Это похоже на вопрос, который, хотя и интересен, не является проблемой; потому что зачем понадобится вам когда-либо нужно быть в первых 0 строках?   -  person Larnu    schedule 10.01.2020
comment
@Larnu Этот ответ объясняет пару сценариев использования TOP 0, хотя я я менее уверен, почему вы пытаетесь выполнить присваивание переменной в том же запросе   -  person Diado    schedule 10.01.2020
comment
Да, использовать его с UNION ALL имеет смысл @Diado; хотя я считаю это странным обходным путем, чтобы просто использовать псевдонимы в правильных местах. Но это не объясняет переменную, но вы согласились и с этим. Это просто не вопрос.   -  person Larnu    schedule 10.01.2020
comment
См. раздел встраивание скалярных определяемых пользователем функций и перемежающееся выполнение, в котором описывается, почему происходят эти поведенческие изменения и как настроить их либо для всей базы данных, либо для каждого запроса, если вы не можете изменить существующий код, чтобы сделать его более разумным (последнее следует предпочесть, потому что эти оптимизации обычно хороши).   -  person Jeroen Mostert    schedule 10.01.2020
comment
Я использовал этот запрос только для того, чтобы объяснить свою проблему, что происходит, когда у вас нет результатов. В производстве я не использую это.   -  person Nihad    schedule 13.01.2020
comment
Это был хороший вопрос, и я действительно не понимаю, почему люди чувствовали необходимость разбирать представленный пример кода, очевидно, это был просто минимальный пример для демонстрации изменения поведения.   -  person codeulike    schedule 29.03.2021


Ответы (1)


Возвращаемый NULL связан со скалярным встраиванием udf:

Неожиданное поведение @@rowcount внутри UDF в MS SQL 2019

если вы хотите, чтобы функция использовала встраивание и возвращала правильные результаты, вы можете реорганизовать ее:

create function [dbo].[TestFunction]
(
    @input uniqueidentifier
)
returns uniqueidentifier
--WITH INLINE = ON
as
begin
    --select top (0) @input= id from randomTable

    return
    (
        isnull((select top (0) id from randomtable), @input)
    )
end
person lptr    schedule 11.01.2020