Applies ToSQL 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 является main узким местом. Встраивание скалярных определяемых пользователем функций T-SQL автоматически преобразует встроенные определяемые пользователем функции в реляционные выражения. 

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

  • Ошибка несоответствия типов возникает, если тип возвращаемого значения UDF является sql_variant (добавлен в SQL Server 2019 CU2).

  • Вызов UDF изsp_executesqlотменяет выполнение (добавлено в SQL Server 2019 CU2).

  • Определяемые пользователем функции, ссылающиеся на метки без связанной команды GOTO , возвращают неверные результаты (добавлены в SQL Server 2019 CU2).

  • Нехватка памяти и утечки памяти происходят из-за очень больших скалярных определяемых пользователем функций (добавленных в SQL Server 2019 CU2).

  • Неинициализированные переменные, используемые в инструкциях condition (IF-ELSE), вызывают ошибки (добавлены в SQL Server 2019 CU2).

  • Явная ошибка преобразования возникает, если определяемая пользователем функция имеет параметр sql_variant(добавлен в SQL Server 2019 CU7).

  • Ошибка возникает, если скалярная функция ссылается на CHECKSUM(добавлена в SQL Server 2019 CU7).

  • Вызов UDF с множеством переоценок скалярных выражений может привести к ошибке планировщика, не приносящее результатов (добавлено в SQL Server 2019 CU7).

    Примечание. Исправление этой проблемы иногда может привести к снижению производительности. Чтобы устранить эту регрессию производительности, можно отключить исходное исправление, включив флаг трассировки (TF) 13156.

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

  • Ошибка возникает, если запрос, ссылающийся на UDF, использует OPTION (RECOMPILE)(добавлен в SQL Server 2019 CU7).

  • Ошибки разрешений возникают, если представления вызывают встроенные определяемые пользователем функции (добавленные в SQL Server 2019 CU9).

  • Нарушения доступа возникают, если используетсяquery_tsql_scalar_udf_inlinedXEvent (добавлено в SQL Server 2019 CU9).

  • Несогласованное поведение происходит из-за того, что встраивание скалярных определяемых пользователем функций не учитывает указание запроса QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n(добавлено в SQL Server 2019 CU9).

  • Встраиваемые определяемые пользователем функции содержат агрегаты, которые могут привести к ошибкам планировщика без получения результатов (добавлено в SQL Server 2019 CU9).

  • Ошибки нехватки памяти возникают из-за последовательности скалярных операций с той же переменной в условных блоках (добавлено в SQL Server 2019 CU9).

  • После обновления до CU9 возникает нарушение доступа, если объект вызывает скалярный встроенный UDF (UDF1), имеющий скалярную встроенную определяемую пользователем функцию (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).

  • Скалярная определяемая пользователем функция возвращает результаты в разных форматах даты и времени, когда включена функция встраивания скалярных UDF (добавлена в 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).

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

  • Если определяемая пользователем функция ссылается на некоторые встроенные функции (например, @@ROWCOUNT), которые могут изменить результаты при встраии пользовательской функции (добавлено в SQL Server 2019 CU2).

  • Когда агрегатные функции передаются в качестве параметров скалярной пользовательской функции (добавлены в SQL Server 2019 CU2).

  • Если UDF ссылается на встроенные представления (например, 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).

  • Если запрос, вызывающий UDF, содержит общие табличные выражения (CTEs) (добавлен в 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 существует в таблице, на которую ссылается индексированное представление, содержащее определяемую пользователем функцию (добавлена в 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:

Статус

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

Ссылки

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

Нужна дополнительная помощь?

Нужны дополнительные параметры?

Изучите преимущества подписки, просмотрите учебные курсы, узнайте, как защитить свое устройство и т. д.

В сообществах можно задавать вопросы и отвечать на них, отправлять отзывы и консультироваться с экспертами разных профилей.