KB4538581 – КОРЕКЦИЯ: Проблеми със вмъкването в скаларен UDF формат през SQL Server 2022 г. и 2019 г.

Отнася се за
SQL Server 2019 on Windows (all editions) SQL Server 2019 on Linux (all editions) SQL Server 2022 on Windows (all editions) SQL Server 2022 on Linux (all editions)

Симптоми

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:

Състояние

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

Справки

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