KB4538581 . ИСПРАВЛЕНИЕ: проблемы с встраиванием скалярных пользовательских функций в SQL Server 2022 и 2019

Применяется к
SQL Server 2019 on Windows (all editions) SQL Server 2019 on Linux (all editions) SQL Server 2022 on Windows (all editions) SQL Server 2022 on Linux (all editions)

Проблема

функции User-Defined , реализованные в Transact-SQL и возвращающие одно значение данных, называются скалярными функциями User-Defined T-SQL.

Функция встраивания скалярных пользовательских функций появилась в Microsoft SQL Server 2019. Эта функция может повысить производительность запросов, которые вызывают скалярные определяемые пользователем функции T-SQL, в которых выполнение UDF является основным узким местом. Встраивание скалярных определяемых пользователем функций T-SQL автоматически преобразует встроенные определяемые пользователем функции в реляционные выражения.

Это накопительное обновление (CU) включает несколько исправлений в следующих областях для сценариев, в которых запрос, использующий скалярную встраивание UDF, может возвращать сообщение об ошибке или непредвиденные результаты:

  • Ошибка несоответствия типов возникает, если тип возвращаемого значения пользовательской функции — ( sql_variant добавлен в SQL Server 2019 CU2).
  • Вызов UDF из sp_executesql отмены выполнения (добавлен в SQL Server 2019 CU2).
  • Определяемые пользователем функции, ссылающиеся на метки без связанной GOTO команды, возвращают неверные результаты (добавлены в SQL Server 2019 CU2).
  • Нехватка памяти и утечки памяти происходят из-за очень больших скалярных определяемых пользователем функций (добавленных в SQL Server 2019 CU2).
  • Неинициализированные переменные, используемые в инструкциях условия (IF-ELSE), вызывают ошибки (добавлены в SQL Server 2019 CU2).
  • Явная ошибка преобразования возникает, если определяемая пользователем функция имеет sql_variant параметр (добавлен в SQL Server 2019 CU7).
  • Ошибка возникает, если скалярная функция ссылается на CHECKSUM (добавлена в SQL Server 2019 CU7).
  • Вызов UDF с большим количеством переоценок скалярных выражений может привести к ошибке планировщика, не возвращающей (добавлен в SQL Server 2019 CU7).
    Примечание. Исправление этой проблемы иногда может привести к снижению производительности. Чтобы устранить эту регрессию производительности, можно отключить исходное исправление, включив флаг трассировки (TF) 13156.
    Корпорация Майкрософт работает над исправлением этой регрессии производительности, которое будет доступно в будущем накопительном пакете обновления.
  • Ошибка возникает, если использует OPTION (RECOMPILE) запрос, ссылающийся на UDF (добавлен в SQL Server 2019 CU7).
  • Ошибки разрешений возникают, если представления вызывают встроенные определяемые пользователем функции (добавленные в SQL Server 2019 CU9).
  • Нарушения доступа возникают, query_tsql_scalar_udf_inlined если используется XEvent (добавлен в SQL Server 2019 CU9).
  • Несогласованное поведение происходит из-за того, что встраивание скалярных определяемых пользователем функций не учитывает QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n указание запроса (добавлено в SQL Server 2019 CU9).
  • Встраиваемые определяемые пользователем функции содержат агрегаты, которые могут привести к ошибкам планировщика без получения (добавлено в SQL Server 2019 CU9).
  • Ошибки нехватки памяти возникают из-за последовательности скалярных операций с той же переменной в условных блоках (добавлено в SQL Server 2019 CU9).
  • После обновления до CU9 возникает нарушение доступа, если объект вызывает скалярную встроенную определяемую пользователем (UDF1) с скалярной встроенной функцией UDF (UDF2), используемой в качестве входного параметра (добавлен в SQL Server 2019 CU11).
  • Встраивание определяемых пользователем функций может вызвать ошибки и создать коды ошибок 6846, 1011 и 107 (добавлены в SQL Server 2019 CU11).
  • Встраивание определяемых пользователем функций, которые выполняются от имени учетной записи, отличной от sysadmin, может вернуть сообщение об ошибке : "В текущей команде произошла серьезная ошибка. Результаты, если таковые есть, должны быть отменены" (добавлено в SQL Server 2019 CU16).
  • Нарушение доступа возникает, если временные таблицы вызываются внутри определяемых пользователем функций с использованием синонимов (добавленных в Microsoft SQL Server 2022 CU1 и SQL Server 2019 CU19).
  • Нарушение доступа возникает, если определение UDF содержит только GOTO метки и инструкции RETURN (добавленные в SQL Server 2022 CU1 и SQL Server 2019 CU19).
  • Скалярная определяемая пользователем функция возвращает результаты в разных форматах даты и времени, когда включена функция встраивания скалярных пользовательских функций (добавлена в SQL Server 2022 CU3 и SQL Server 2019 CU20).
  • Файл дампа создается, если запрос с предложением GROUP BY использует встроенные определяемые пользователем функции в SELECT инструкции без агрегатной функции (добавлен в SQL Server 2022 CU12 и SQL Server 2019 CU26).
  • Ошибка "Превышен максимальный уровень вложенной хранимой процедуры, функции, триггера или представления (ограничение 32)", если включена функция встраивания скалярных определяемых пользователем функций, даже если уровень вложения не превышен (добавлен в SQL Server 2022 CU12 и SQL Server 2019 CU26).
  • Повреждение памяти происходит в sqllang.dll!CProchdr::FDeriveInlineabilityOfScalarUdf , если включена функция встраивания скалярных пользовательских функций (добавлена в SQL Server 2022 CU12 и SQL Server 2019 CU26).
  • Неправильные результаты возникают из-за сочетания скалярных пользовательских функций встраивания и OPTION (RECOMPILE) в том же запросе (добавлен в SQL Server 2022 CU17 и SQL Server 2019 CU31).

Это накопительное обновление также блокирует встраивание в следующих сценариях:

  • Если определяемая пользователем функция ссылается на определенные встроенные функции (например, @@ROWCOUNT), которые могут изменить результаты, если определяемая пользователем функция включена (добавлена в SQL Server 2019 CU2).
  • Если агрегатные функции передаются в качестве параметров скалярной пользовательской функции (добавлена в SQL Server 2019 CU2).
  • Если определяемая пользователем функция ссылается на встроенные представления (например, OBJECT_ID) (добавлено в SQL Server 2019 CU2).
  • Если определяемая пользователем функция использует методы XML (добавлено в SQL Server 2019 CU4).
  • Если определяемая пользователем функция содержит инструкцию SELECT , которая использует ORDER BY предложение , но нет TOP 1 (добавлена в SQL Server 2019 CU4).
  • SELECT Если инструкция выполняет назначение вместе с предложением ORDER BY (например, SELECT @x = @x +1 FROM table ORDER BY column_name) (добавлено в SQL Server 2019 CU4).
  • Если определяемая пользователем функция содержит несколько RETURN инструкций (добавлено в SQL Server 2019 CU5).
  • Если определяемая пользователем функция вызывается из инструкции RETURN (добавлена в SQL Server 2019 CU5).
  • Если определяемая пользователем функция ссылается на STRING_AGG функцию (добавлена в SQL Server 2019 CU5).
  • Если определение UDF ссылается на удаленные таблицы (добавлено в SQL Server 2019 CU6).
  • Если запрос, вызывающий UDF, использует GROUPING SETS, CUBEили ROLLUP (добавлен в SQL Server 2019 CU6).
  • Если запрос, вызывающий UDF, содержит переменную, которая используется в качестве параметра UDF для назначения (например, SELECT @y=2, @x=UDF(@y)) (добавлена в SQL Server 2019 CU6).
  • Если определяемая пользователем функция ссылается на зашифрованные столбцы (добавлено в SQL Server 2019 CU11).
  • Если определяемая пользователем функция содержит ссылки на WITH XMLNAMESPACES (добавлено в SQL Server 2019 CU11).
  • Если запрос, вызывающий определяемую пользователем функцию, содержит общие табличные выражения (CTE) (добавлен в SQL Server 2019 CU11).
  • Если определение UDF содержит временные таблицы или синонимы для временных таблиц (добавлено в SQL Server 2022 CU1 и SQL Server 2019 CU19).
  • Если определение UDF содержит инструкцию SELECT вместе с предложением DISTINCT для нескольких столбцов назначения (добавлено в SQL Server 2022 CU4 и SQL Server 2019 CU20).
  • Если определяемая пользователем функция содержит инструкцию SELECT , которая использует TABLESAMPLE PERCENT предложение и несколько назначений переменных (добавлено в SQL Server 2022 CU7).
  • INSERT Если запрос существует в таблице, на которую ссылается индексированное представление, содержащее UDF (добавлено в SQL Server 2022 CU12 и SQL Server 2019 CU26).

После обновления до SQL Server 2019 CU2, но перед обновлением до SQL Server 2019 CU5 следует повторно оценить, подходит ли определяемая пользователем функция для встраивания. Для этого обновите подходящие скалярные определяемые пользователем функции с помощью любого из следующих методов:

  • Выполните для sp_refreshsqlmodule применимых скалярных определяемых пользователем функций. Дополнительные сведения об этой системной хранимой процедуре см. в разделе sp_refreshsqlmodule (Transact-SQL).
  • Измените или повторно создайте существующую скалярную определяемую пользователем функцию, используя существующие определения, разрешения и свойства set. Дополнительные сведения см. в разделе ALTER FUNCTION (Transact-SQL).

Следующая команда создает скрипт для обновления метаданных всех существующих встроенных скалярных определяемых пользователем функций:


/*

Generates a script that can be used to refresh all active inlineable scalar UDFs.

Note The sp_refreshsqlmodule command does not affect any permissions, extended properties, or SET options that are associated with the object.

*/

SELECT 'EXECUTE sys.sp_refreshsqlmodule ''[' + OBJECT_SCHEMA_NAME(object_id) + +'].' + '[' + OBJECT_NAME(object_id)

+ ']'';' AS 'RefreshStatement'

FROM sys.sql_modules

WHERE is_inlineable = 1

AND inline_type = 1;

GO

Примечание. После обновления до SQL Server 2019 с накопительным пакетом обновления 5 (CU5) мы возобновим автоматическое создание встроенной функции определяемой пользователем функции во время компиляции.

Решение

Эта проблема устранена в следующих накопительных обновлениях для SQL Server:

Сведения о накопительных обновлениях для SQL Server

Каждое новое накопительное обновление для SQL Server содержит все исправления и все исправления для системы безопасности, которые были включены в предыдущее накопительное обновление. Ознакомьтесь с последними накопительными обновлениями для SQL Server:

Состояние

Корпорация Майкрософт подтвердила, что это проблема в продуктах Майкрософт, перечисленных в разделе "Применимо к".

Ссылки

Узнайте о терминологии, используемой корпорацией Майкрософт для описания обновлений программного обеспечения.