Симптоми
User-Defined функции (UDF), които са реализирани в Transact-SQL и които връщат единична стойност на данни, се наричат T-SQL скаларни User-Defined функции (UDF).
Функцията за вмъкване на скаларна UDF е въведена в Microsoft SQL Server 2019. Тази функция може да подобри ефективността на заявките, които извикват T-SQL скаларни UDF, в които изпълнението на UDF е основното слабо място. T-SQL скаларната UDF вграждане автоматично трансформира вградените UDF файлове в релационни изрази.
Тази кумулативна актуализация (CU) включва няколко корекции в следните области за сценарии, при които заявка, използваща вмъкване на скаларен UDF файл, може да върне съобщение за грешка или неочаквани резултати:
- Възниква грешка поради несъответствие на типове, ако типът на връщане на UDF е (
sql_variantдобавена в SQL Server 2019 CU2). - Извикването на UDF от
sp_executesqlотменя изпълнението (добавено в SQL Server 2019 CU2). - UDF функции, които препращат към етикети без свързана
GOTOкоманда, връщат неправилни резултати (добавени в SQL Server 2019 CU2). - Условията на недостиг на памет и изтичанията на памет възникват поради много големи скаларни UDF (добавени в SQL Server 2019 CU2).
- Неинициализираните променливи, които се използват в инструкции за условие (
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.
Microsoft работи върху корекция за тази регресия на производителността, която ще бъде налична в бъдеща CU. - Възниква, ако заявката за препращане към UDF потребители използва
OPTION (RECOMPILE)(добавено в SQL Server 2019 CU7). - Възникват грешки в разрешенията, ако изгледите извикват вградени UDF (добавени в SQL Server 2019 CU9).
- Нарушения на достъпа възникват, ако
query_tsql_scalar_udf_inlinedсе използва XEvent (добавено в SQL Server 2019 CU9). - Несъгласуваното поведение се появява, защото вмъкването на скаларна UDF не спазва подсказването за
QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_nзаявка (добавено в SQL Server 2019 CU9). - Вградените UDF функции съдържат агрегирания, които могат да доведат до грешки в графикатора без доход (добавено в SQL Server 2019 CU9).
- Грешките при недостиг на памет възникват поради последователност от скаларни операции върху една и съща променлива в условни блокове (добавени в SQL Server 2019 CU9).
- След като надстроите до CU9, възниква непозволен достъп до памет, ако даден обект извика скаларна вградена UDF (UDF1), която има скаларна вградена UDF (UDF2), която се използва като входен параметър (добавена в SQL Server 2019 CU11).
- Вмъкването на UDF може да доведе до грешки и да генерира кодове на грешка 6846, 1011 и 107 (добавени в SQL Server 2019 CU11).
- Вграждането на UDF, които се изпълняват като акаунт, който не е sysadmin, може да върне съобщение за грешка: "Възникна сериозна грешка при текущата команда. Резултатите, ако има такива, трябва да бъдат отхвърлени" (добавено в SQL Server 2019 CU16).
- Нарушение на достъпа възниква, ако временните таблици се извикат вътре в UDF с помощта на синоними (добавени в 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клауза, използва вградени UDF в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 и
OPTION (RECOMPILE)в една и съща заявка (добавена в SQL Server 2022 CU17 и SQL Server 2019 CU31).
Тази кумулативна актуализация също така блокира вграденото в следните сценарии:
- Ако 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, съдържа променлива, която се използва като UDF параметър за присвояване (например
SELECT @y=2, @x=UDF(@y)) (добавена в SQL Server 2019 CU6). - Ако UDF функцията препраща към шифровани колони (добавени в SQL Server 2019 CU11).
- Ако UDF функцията съдържа препратки към
WITH XMLNAMESPACES(добавено в SQL Server 2019 CU11). - Ако заявката, която извиква UDF, има общи таблични изрази (CTE) (добавени в 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 функция отговаря на условията за вграждане. За да направите това, обновете допустимите скаларни UDF файлове чрез някой от следните методи:
- Изпълнение
sp_refreshsqlmoduleза приложими скаларни UDF. За повече информация за тази съхранена в системата процедура вижте sp_refreshsqlmodule (Transact-SQL). - Променете или създайте отново съществуващата скаларна UDF с помощта на съществуващи дефиниции, разрешения и свойства на набора. За повече информация вж. ALTER ФУНКЦИЯ (Transact-SQL).
Следната команда генерира скрипт за обновяване на метаданните на всички съществуващи вградени скаларни UDF:
/*
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 съдържа всички актуални поправки и корекции на защитата, които са били включени в предишната кумулативна актуализация. Прегледайте последните кумулативни актуализации за SQL Server:
- Най-нова кумулативна актуализация за SQL Server 2022
- Последна кумулативна актуализация за SQL Server 2019
Състояние
Microsoft потвърждава, че това е проблем в продуктите на Microsoft, които са изброени в раздела "Важи за".
Справки
Научете повече относно терминологията, която Microsoft използва за описване на актуализациите на софтуера.