Перейти до основного
Підтримка
Вхід
Вхід за допомогою облікового запису Microsoft
Увійдіть або створіть обліковий запис.
Вітаємо,
Виберіть інший обліковий запис.
У вас є кілька облікових записів
Виберіть обліковий запис, за допомогою якого потрібно ввійти.

Ознаки

функції User-Defined (UDFS), реалізовані в Transact-SQL і які повертають одне значення даних, відомі як функції T-SQL Scalar User-Defined (UDFs). 

У microsoft SQL Server 2019 з'явилась функція скалярного перетворення UDF. Ця функція може підвищити продуктивність запитів, які викликають T-SQL Скалярні UDFs, в яких виконання UDF є основним вузьким місцем. Функція T-SQL Scalar UDF Inlining автоматично перетворює вбудовані файли UDFS у реляційні вирази. 

Цей сукупний пакет оновлень (CU) містить кілька виправлень у наведених нижче областях для сценаріїв, у яких запит, який використовує скалярне перетворення UDF, може повернути повідомлення про помилку або неочікувані результати:

  • Помилка невідповідності типів виникає, якщо тип повернення UDF – це sql_variant (додано до SQL Server 2019 CU2).

  • Виклик UDF зsp_executesqlскасовує виконання (додано до SQL Server 2019 CU2).

  • UDFs, які посилаються на підписи без пов'язаної команди GOTO , повертають неправильні результати (додані в SQL Server 2019 CU2).

  • Через дуже великі скалярні файли UDFS (додано до SQL Server 2019 CU2) виникають через бракує пам'яті та втрат пам'яті.

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

  • Явна помилка перетворення виникає, якщо UDF має параметр sql_variant(додано до SQL Server 2019 CU7).

  • Помилка виникає, якщо скалярна функція посилається на CHECKSUM(додано до SQL Server 2019 CU7).

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

    Примітка. Вирішення цієї проблеми іноді може спричинити зниження продуктивності. Щоб зменшити цю регресію продуктивності, можна вимкнути вихідне виправлення, увімкнувши позначку трасування (TF) 13156.

    Корпорація Майкрософт працює над виправленням цієї регресії продуктивності, яка буде доступна в майбутньому cu.

  • Помилка виникає, якщо запит на посилання UDF використовує OPTION (RECOMPILE)(додано до SQL Server 2019 CU7).

  • Помилки дозволів виникають, якщо подання викликають вбудовані файли UDFS (додані в SQL Server 2019 CU9).

  • Порушення прав доступу виникають, якщо використовуєтьсяquery_tsql_scalar_udf_inlinedXEvent (додано до SQL Server 2019 CU9).

  • Неузгоджена поведінка виникає через те, що скалярне перетворення UDF inlining не поважає підказку QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_nзапиту (додано до SQL Server 2019 CU9).

  • Inlining UDFs містять агрегації, які можуть призвести до неприбуткових помилок планувальника (додано до SQL Server 2019 CU9).

  • Помилки бракує пам'яті через послідовність скалярних операцій на тій самій змінної в умовних блоках (додано в SQL Server 2019 CU9).

  • Після оновлення до CU9 порушення прав доступу виникає, якщо об'єкт викликає скалярний вбудований UDF (UDF1), який має скалярний вбудований UDF (UDF2), який використовується як вхідний параметр (додається в SQL Server 2019 CU11).

  • Інлінування UDFs може призвести до помилок і створення кодів помилок 6846, 1011 і 107 (доданих у SQL Server 2019 CU11).

  • Інлінування UDFs, які виконуються як обліковий запис, відмінне від sysadmin, може повернути повідомлення про помилку "Сталася серйозна помилка в поточній команді.  Результати, якщо є, слід вилучити" (додано в SQL Server 2019 CU16).

  • Порушення прав доступу виникає, якщо тимчасові таблиці викликаються в UDFS за допомогою синонімів (доданих у Microsoft SQL Server 2022 CU1 і SQL Server 2019 CU19).

  • Порушення прав доступу виникає, якщо визначення UDF містить лише GOTO підписи таRETURN оператор (додано до SQL Server 2022 CU1 і SQL Server 2019 CU19).

  • Скалярне UDF повертає результати в різних форматах дати й часу, коли ввімкнуто функцію підкреслення Скалярного UDF (додається в SQL Server 2022 CU3 та SQL Server 2019 CU20).

  • Файл дампа створюється, якщо запит, який має GROUP BY речення використовує inlined UDFs в SELECT оператор без агрегатна функція (додається в SQL Server 2022 CU12 і SQL Server 2019 CU26).

  • Помилка "Перевищено максимальну кількість збережених процедур, функцій, тригерів або подань рівня вкладення (обмеження 32)", якщо ввімкнуто функцію підкреслення Скалярного UDF, навіть якщо рівень вкладення не перевищено (додано до SQL Server 2022 CU12 і SQL Server 2019 CU26).

  • Пошкодження пам'яті відбувається в sqllang.dll!CProchdr::FDeriveInlineabilityOfScalarUdf , якщо ввімкнуто функцію підкреслення Скалярного UDF (додано до SQL Server 2022 CU12 і SQL Server 2019 CU26).

Цей сукупний пакет оновлень також блокує інлайнування в таких сценаріях:

  • Якщо UDF посилається на певні вбудовані функції (наприклад, @@ROWCOUNT), які можуть змінювати результати, коли UDF підкреслено (додано до SQL Server 2019 CU2).

  • Коли агрегатні функції передаються як параметри скалярному UDF (додається в SQL Server 2019 CU2).

  • Якщо UDF посилається на вбудовані подання (наприклад, OBJECT_ID) (додано в SQL Server 2019 CU2).

  • Якщо UDF використовує XML-методи (додані в SQL Server 2019 CU4).

  • Якщо UDF містить інструкцію 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).

  • Якщо UDF містить кілька RETURN операторів (додано в SQL Server 2019 CU5).

  • Якщо UDF викликається з RETURN оператора (додається в SQL Server 2019 CU5).

  • Якщо UDF посилається на функцію STRING_AGG (додано до SQL Server 2019 CU5).

  • Якщо визначення UDF посилається на віддалені таблиці (додано до SQL Server 2019 CU6).

  • Якщо запит викликів UDF використовує GROUPING SETS, CUBEабо ROLLUP (додано до SQL Server 2019 CU6).

  • Якщо запит UDF-calling містить змінну, яка використовується як параметр UDF для призначення (наприклад, SELECT @y=2, @x=UDF(@y)) (додається в SQL Server 2019 CU6).

  • Якщо UDF посилається на зашифровані стовпці (додано в SQL Server 2019 CU11).

  • Якщо UDF містить посилання на 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).

  • Якщо UDF містить інструкцію 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, слід повторно оцінити, чи UDF має право на інлайнування. Для цього оновіть відповідні скалярні файли UDFS будь-якими з наведених нижче способів.

  • Запустіть sp_refreshsqlmodule для застосовних скалярних файлів UDFS. Докладні відомості про збережену в системі процедуру див. в статті sp_refreshsqlmodule (Transact-SQL).

  • Змінюйте або повторно створюйте наявні скалярні UDF за допомогою наявних визначень, дозволів і настроювання властивостей. Докладні відомості див. в статті ALTER FUNCTION (Transact-SQL).

Наведена нижче команда створює сценарій для оновлення метаданих наявних вбудованих скалярних файлів UDFS:

/*

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 ми відновимо автоматичне отримання вбудованої функції UDF під час компіляції.

Спосіб вирішення

Цю проблему вирішено в сукупному пакеті оновлень для SQL Server:

Кожен новий сукупний пакет оновлень для SQL Server містить усі виправлення та всі виправлення системи безпеки, які входили в попередній сукупний пакет оновлень. Ознайомтеся з останніми сукупними оновленнями для SQL Server:

Стан

Корпорація Майкрософт підтвердила, що це проблема в продуктах Microsoft, перелічених у розділі "Стосується".

Посилання

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

Потрібна додаткова довідка?

Потрібні додаткові параметри?

Ознайомтеся з перевагами передплати, перегляньте навчальні курси, дізнайтесь, як захистити свій пристрій тощо.

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

Чи ця інформація була корисною?

Наскільки ви задоволені якістю мови?
Що вплинуло на ваші враження?
Натиснувши кнопку "Надіслати", ви надасте свій відгук для покращення продуктів і служб Microsoft. Ваш ІТ-адміністратор зможе збирати ці дані. Декларація про конфіденційність.

Дякуємо за відгук!

×