Проблемы
функции 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).
-
Нарушение доступа возникает, когда объект вызывает скалярный встроенный UDF (UDF1), имеющий скалярную встроенную определяемую пользователем (UDF2), которая используется в качестве входного параметра после обновления до CU9 (добавлена в 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).
Это накопительное обновление также блокирует встраивание в следующих сценариях:
-
Если определяемая пользователем функция ссылается на определенные встроенные функции (например, @@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).
После обновления до 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 CU5 мы автоматически наследуем встраиваемость определяемой пользователем функции во время компиляции.
Решение
Эта проблема устранена в следующих накопительных обновлениях для SQL Server:
Каждое новое накопительное обновление для SQL Server содержит все исправления и все исправления для системы безопасности, которые были включены в предыдущее накопительное обновление. Ознакомьтесь с последними накопительными обновлениями для SQL Server:
Статус
Корпорация Майкрософт подтвердила, что это проблема в продуктах Майкрософт, перечисленных в разделе "Применимо к".
Ссылки
Сведения о терминологии , которую корпорация Майкрософт использует для описания обновлений программного обеспечения.