Проблемы

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:

Статус

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

Ссылки

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

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

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

Были ли сведения полезными?

Насколько вы удовлетворены качеством перевода?
Что повлияло на вашу оценку?

Спасибо за ваш отзыв!

×