Преминаване към основното съдържание
Поддръжка
Влизане с Microsoft
Влезте или създайте акаунт.
Здравейте,
Изберете друг акаунт.
Имате няколко акаунта
Изберете акаунта, с който искате да влезете.

Симптоми

User-Defined функции (UDF), които се изпълняват в Transact-SQL и връщат една стойност на данни, са известни като T-SQL скаларни User-Defined функции (UDF). 

Функцията Scalar UDF Inlining беше въведена в Microsoft SQL Server 2019. Тази функция може да подобри производителността на заявките, които извикват T-SQL скаларни UDF файлове, в които изпълнението на UDF е основното тясно място. T-SQL Scalar UDF Inlining автоматично превръща вградените UDF в релационни изрази. 

Тази кумулативна актуализация (CU) включва няколко корекции в следните области за сценарии, при които заявка, която използва Scalar UDF Inlining, може да върне съобщение за грешка или неочаквани резултати:

  • Възниква грешка поради несъответствие на тип, ако типът на връщане на 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_inlinedXEvent (добавен в SQL Server 2019 CU9).

  • Несъгласувано поведение възниква, защото Scalar UDF inlining не спазва 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).

  • Scalar UDF връща резултати в различни формати за дата и час, когато функцията Scalar UDF Inlining е включена (добавена в SQL Server 2022 CU3 и SQL Server 2019 CU20).

  • Вторичен файл се генерира, ако заявка, която има клауза за GROUP BY използва наклонени UDF в команда на SELECT без агрегатна функция (добавена в SQL Server 2022 CU12 и SQL Server 2019 CU26).

  • Грешка "Максимално съхранена процедура, функция, превключвател или ниво на вложения изглед надвишено (ограничение 32)" възниква, ако функцията Scalar UDF inlining е включена, дори ако нивото на влагане не е надвишено (добавено в SQL Server 2022 CU12 и SQL Server 2019 CU26).

  • Повреждането на паметта възниква в sqllang.dll!CProchdr::FDeriveInlineabilityOfScalarUdf ако функцията Scalar UDF Inlining е включена (добавена в 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 повикване съдържа променлива, която се използва като 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 отговаря на условията за подчертаване. За да направите това, обновете скаларните 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:

Статут

Microsoft потвърди, че това е проблем в продуктите на Microsoft, които са изброени в раздела "Отнася се за".

Препратки

Научете повече за терминологията , която Microsoft използва за описване на актуализациите на софтуера.

Нуждаете ли се от още помощ?

Искате ли още опции?

Разгледайте ползите от абонамента, прегледайте курсовете за обучение, научете как да защитите устройството си и още.

Общностите ви помагат да задавате и отговаряте на въпроси, да давате обратна връзка и да получавате информация от експерти с богати знания.

Беше ли полезна тази информация?

Доколко сте доволни от качеството на езика?
Какво е повлияло на вашия потребителски опит?
Като натиснете „Подаване“, вашата обратна връзка ще се използва за подобряване на продуктите и услугите на Microsoft. Вашият ИТ администратор ще може да събира тези данни. Декларация за поверителност.

Благодарим ви за обратната връзка!

×