Проблемы
User-Defined функции (UDF), реализованные в Transact-SQL и возвращающие одно значение данных, называются Скалярными User-Defined T SQL-User-Defined (UDF).
Microsoft SQL Server 2019 г. представлена функция встраивания скалярных определяемых пользователем функций, которая может повысить производительность запросов, вызывающих Скалярные определяемые пользователем функции T-SQL, в которых выполнение определяемой пользователем функции является основным узким местом. Встраивание SQL Скалярной определяемой пользователем функции автоматически преобразует встроенные определяемые пользователем функции в реляционные выражения.
Это накопительное обновление включает несколько исправлений в следующих областях для сценариев, в которых запрос, использующий встраивание скалярных определяемых пользователем функций, может возвращать ошибку или непредвиденные результаты:
-
Ошибка несоответствия типов, если возвращаемый тип определяемой пользователем функции является sql_variant (добавлен в накопительный пакет обновления 2 Microsoft SQL Server 2019 г.)
-
Вызов определяемой пользователем функции sp_executesql прерывает выполнение (добавлено в накопительный пакет обновления 2 Microsoft SQL Server 2019 г.)
-
Определяемые пользователем функции, ссылаясь на метки без связанной команды GOTO, возвращают неверные результаты (добавлены в накопительный пакет обновления 2 (CU2) Microsoft SQL Server 2019 г.)
-
Условия нехватки памяти и утечка памяти возникают из-за очень больших скалярных определяемых пользователем функций (добавленных в накопительный пакет обновления 2 (CU2) Microsoft SQL Server 2019 г.)
-
Неинициализированные переменные, используемые в инструкциях условия (IF-ELSE), вызывают ошибки (добавлены в накопительный пакет обновления 2 Microsoft SQL Server 2019 г.)
-
Явная ошибка преобразования, если определяемая пользователем функция SQL_VARIANT параметра (добавлена в накопительный пакет обновления 7 Microsoft SQL Server 2019 г.)
-
Ошибка, возникают, когда скалярная функция ссылается на CHECKSUM (добавлена Microsoft SQL Server 2019 CU7)
-
Вызов определяемой пользователем функции с высоким количеством повторных вычислений скалярных выражений может привести к ошибке планировщика, которая не возвращается (добавлена в накопительный пакет обновления 7 Microsoft SQL Server 2019 г.)
-
Ошибка, вызываемая, когда определяемая пользователем функция ссылается на запрос с использованием OPTION (RECOMPILE) (добавлена в накопительный пакет обновления 7 (CU7) Microsoft SQL Server 2019 г.)
-
Ошибки разрешений, которые возникают, когда представления вызывают встроенные определяемые пользователем функции (добавлены в накопительный пакет обновления 9 Microsoft SQL Server 2019 г.)
-
Нарушения доступа при использовании XEvent query_tsql_scalar_udf_inlined (добавлены в накопительный пакет обновления 9 Microsoft SQL Server 2019 г.)
-
Несогласованное поведение из-за того, что встраивание скалярной определяемой пользователем функции не учитывает указание запроса QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n (добавлено в накопительный пакет обновления 9 Microsoft SQL Server 2019 г.)
-
Встроенные определяемые пользователем функции содержат агрегаты, которые могут привести к ошибке планировщика, которая не возвращается (добавлена в накопительный пакет обновления 9 (CU9) Microsoft SQL Server 2019 г.)
-
Ошибки нехватки памяти из-за последовательности скалярных операций с той же переменной в условных блоках (добавлены в накопительный пакет обновления 9 Microsoft SQL Server 2019 г.)
-
Нарушение доступа может возникнуть, когда объект вызывает скалярную встроенную определяемую пользователем функцию (UDF1) с скалярной встроенной определяемой пользователем функцией (UDF2), которая используется в качестве входного параметра после обновления до накопительного пакета обновления 9 (добавлена в накопительный пакет обновления 11 Microsoft SQL Server 2019 г.)
-
Встраивание определяемых пользователем функций может привести к ошибке со следующими кодами ошибок 6846, 1011 и 107 (добавлены в Microsoft SQL Server 2019 CU11)
-
При встраии определяемых пользователем функций, работающих в качестве учетной записи, отличной от sysadmin, может возникать ошибка "В текущей команде произошла серьезная ошибка. Результаты ,если таковое есть, должны быть отброшены" (добавлены в накопительный пакет обновления 16 Microsoft SQL Server 2019 г.)
Это накопительное обновление также блокирует встраивание в следующих сценариях:
-
Если определяемая пользователем функция ссылается на определенные встроенные функции (например, @@ROWCOUNT), которые могут изменять результаты при встраии (добавлены в накопительный пакет обновления 2 Microsoft SQL Server 2019 г.)
-
Когда агрегатные функции передаются в качестве параметров в скалярную определяемую пользователем функцию (добавлена в накопительный пакет обновления 2 Microsoft SQL Server 2019 г.)
-
Если определяемая пользователем функция ссылается на встроенные представления (например, OBJECT_ID) (добавлена в накопительный пакет обновления 2 Microsoft SQL Server 2019 г.)
-
Если определяемая пользователем функция использует методы XML (добавлена Microsoft SQL Server 2019 CU4)
-
Если определяемая пользователем функция содержит инструкцию SELECT с предложением ORDER BY без "TOP 1" (добавлено в Microsoft SQL Server 2019 CU4)
-
Если запрос SELECT выполняет назначение в сочетании с предложением ORDER BY (например, SELECT @x = @x +1 FROM table ORDER BY column_name) (добавлено в накопительный пакет обновления 4 для Microsoft SQL Server 2019 г.)
-
Если определяемая пользователем функция содержит несколько инструкций RETURN (добавлена Microsoft SQL Server CU5 2019)
-
Если определяемая пользователем функция вызывается из инструкции RETURN (добавлена в Microsoft SQL Server CU5 2019)
-
Если определяемая пользователем функция ссылается на функцию STRING_AGG (добавлена Microsoft SQL Server 2019 CU5)
-
Если определение определяемой пользователем функции ссылается на удаленные таблицы (добавлено в накопительный пакет обновления 6 Microsoft SQL Server 2019 г.)
-
Если запрос, вызывающий UDF, использует GROUPING SETS, CUBE или ROLLUP (добавлен в накопительный пакет обновления 6 Microsoft SQL Server 2019)
-
Если вызывающий UDF запрос содержит переменную, которая используется в качестве параметра определяемой пользователем функции для назначения (например, SELECT @y=2, @x=UDF(@y)) (добавлена в накопительный пакет обновления 6 Microsoft SQL Server 2019 г.)
-
Если определяемая пользователем функция ссылается на зашифрованные столбцы (добавленные в Microsoft SQL Server 2019 CU11)
-
Если определяемая пользователем функция содержит ссылки на WITH XMLNAMESPACES (добавлена в Microsoft SQL Server 2019 CU11)
-
Если запрос, который вызывает определяемую пользователем функцию, содержит общие табличные выражения (CTE) (добавлен в Microsoft SQL Server 2019 CU11)
После обновления до версии Microsoft SQL Server 2019 с накопительным пакетом обновления 2 (CU2), но перед обновлением до накопительного пакета обновления 5 необходимо повторно оценить, подходит ли определяемая пользователем функция для встраировки. Для этого обновите подходящие скалярные определяемые пользователем функции с помощью любого из следующих методов:
-
Выполните sp_refreshsqlmodule для применимых скалярных определяемых пользователем функций (дополнительные сведения об этой системной хранимой процедуре см. в sp_refreshsqlmodule (Transact-SQL).
-
Изменение или повторное создание существующей скалярной определяемой пользователем функции с помощью существующего определения, разрешений и задайте свойства (см. инструкции 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
Примечание. После обновления до Microsoft SQL Server накопительного пакета обновления 5 (CU5) мы автоматически создадим встроенную функцию определяемой пользователем функции во время компиляции.
Решение
Эта проблема устранена в следующем накопительном обновлении для SQL Server:
Каждое новое накопительное обновление для SQL Server содержит все исправления и все исправления безопасности, которые были включены в предыдущее накопительное обновление. Ознакомьтесь с последними накопительными обновлениями для SQL Server:
Статус
Корпорация Майкрософт подтверждает наличие этой проблемы в своих продуктах, которые перечислены в разделе "Применяется к".
Ссылки
Сведения о терминологии, используемой корпорацией Майкрософт для описания обновлений программного обеспечения.