Príznaky
User-Defined funkcie (UDF), ktoré sú implementované v transact-SQL a ktoré vracajú jednu hodnotu údajov, sú známe ako skalárne User-Defined funkcie T-SQL (UDF).
Microsoft SQL Server 2019 predstavil funkciu škálovania UDF. Táto funkcia môže zlepšiť výkon dotazov, ktoré vyvolávajú skalárne UDF T-SQL, pričom hlavným kritickým miestom je spustenie UDF. T-SQL Scalar UDF Inlining automaticky transformuje vnorené súbory UDF na relačné výrazy.
Táto kumulatívna aktualizácia obsahuje niekoľko opráv v nasledujúcich oblastiach pre scenáre, v ktorých dotaz, ktorý používa scalar UDF Inlining, môže vrátiť chybu alebo neočakávané výsledky:
-
Chyba nezhody typov, ak je vrátený typ UDF sql_variant (pridané v SQL Server 2019 CU2)
-
Vyvolanie UDF zsp_executesql ruší spustenie (pridané v SQL Server 2019 CU2)
-
Súbory UDF odkazujúce na označenia bez priradeného príkazu GOTO vrátia nesprávne výsledky (pridané v SQL Server 2019 CU2)
-
Stavy nedostatku pamäte a pretekanie pamäte sa vyskytujú z dôvodu veľmi veľkých skalárnych súborov UDF (pridaných v SQL Server 2019 CU2)
-
Neinicializované premenné používané v príkazoch stavu (IF-ELSE) spôsobujú chyby (pridané v SQL Server 2019 CU2)
-
Explicitná chyba konverzie, ak má UDF parameter sql_variant(pridaný v SQL Server 2019 CU7)
-
Chyba sa vyskytuje, keď skalárna funkcia odkazuje na CHECKSUM(pridané v SQL Server 2019 CU7)
-
Vyvolanie UDF s veľkým počtom opätovných vyhodnotení skalárneho výrazu môže spôsobiť chybu nenáročného plánovača (pridanú do SQL Server 2019 CU7)
Poznámka: Oprava tohto problému môže niekedy spôsobiť regresiu výkonu. Ak chcete obmedziť túto regresiu výkonu, môžete pôvodnú opravu vypnúť zapnutím príznaku sledovania (TF) 13156.
Spoločnosť Microsoft pracuje na oprave tejto regresie výkonu, ktorá bude k dispozícii v budúcej cu.
-
Chyba sa vyskytuje, keď dotaz odkazujúci na UDF používa OPTION (RECOMPILE)(pridané v SQL Server 2019 CU7)
-
Chyby povolení sa vyskytujú, keď zobrazenia vyvolávajú vložené súbory UDF (pridané v SQL Server 2019 CU9)
-
Porušenie prístupu sa vyskytuje pri použití query_tsql_scalar_udf_inlinedXEvent (pridané v SQL Server 2019 CU9)
-
Nekonzistentné správanie spôsobené tým, že scalar UDF Inlining nerešpektuje QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_ntip dotazu (pridané v SQL Server 2019 CU9)
-
Tvorba prehľadu používateľských súborov obsahuje agregácie, ktoré môžu spôsobiť chyby nenáročného plánovača (pridané v SQL Server 2019 CU9)
-
Chyby nedostatku pamäte v dôsledku postupnosti skalárnych operácií s rovnakou premennou v podmienených blokoch (pridané v SQL Server 2019 CU9)
-
Porušenie prístupu sa môže vyskytnúť, keď objekt vyvolá skalárny vnorený UDF (UDF1) so skalárnym vnoreným UDF (UDF2), ktorý sa používa ako vstupný parameter po inovácii na CU9 (pridaný v SQL Server 2019 CU11)
-
Tvorba prehľadu UDF môže spôsobiť chyby s kódmi chýb 6846, 1011 a 107 (pridané v SQL Server 2019 CU11)
-
Tvorba prehľadu súborov UDF spustených ako konto, ktoré nie je kontom sysadmin, môže spôsobiť chybu V aktuálnom príkaze sa vyskytla závažná chyba. Ak existujú výsledky, mali by sa zahodiť" (pridané v SQL Server 2019 CU16)
-
Porušenie prístupu nastane, keď sa dočasné tabuľky vyvolajú v používateľskom súbore pomocou synoným (pridaných v programoch Microsoft SQL Server 2022 CU1 a SQL Server 2019 CU19)
-
Porušenie prístupu nastane, ak definícia UDF obsahuje iba označenia GOTO a príkazRETURN (pridaný v SQL Server 2022 CU1 a SQL Server 2019 CU19)
Táto kumulatívna aktualizácia blokuje aj tvorbu prehľadu v nasledujúcich scenároch:
-
Ak UDF odkazuje na určité vnútorné funkcie (napríklad @@ROWCOUNT), ktoré môžu zmeniť výsledky, keď sú uvedené (pridané v SQL Server 2019 CU2)
-
Pri odovzdávaní agregačných funkcií ako parametrov do skalárneho UDF (pridaného v SQL Server 2019 CU2)
-
Ak UDF odkazuje na vstavané zobrazenia (napríklad: OBJECT_ID) (pridané v SQL Server 2019 CU2)
-
Ak UDF používa metódy XML (pridané v SQL Server 2019 CU4)
-
Ak UDF obsahuje SELECTs ORDER BYa bez TOP 1(pridané v SQL Server 2019 CU4)
-
Ak dotazSELECT vykoná priradenie v spojení s klauzulou ORDER BY (napríklad SELECT @x = @x +1 FROM table ORDER BY column_name) (pridaná do SQL Server 2019 CU4)
-
Ak UDF obsahuje viacero príkazov RETURN (pridaných v SQL Server 2019 CU5)
-
Ak sa UDF volá z príkazu RETURN (pridaného v SQL Server 2019 CU5)
-
Ak UDF odkazuje na funkciu STRING_AGG (pridanú v SQL Server 2019 CU5)
-
Ak definícia UDF odkazuje na vzdialené tabuľky (pridané v SQL Server 2019 CU6)
-
Ak dotaz volajúci UDF používa GROUPING SETS, CUBEalebo ROLLUP (pridané v SQL Server 2019 CU6)
-
Ak dotaz volania UDF obsahuje premennú, ktorá sa používa ako parameter UDF pre priradenie (napríklad SELECT @y=2, @x=UDF(@y)) (pridaná v SQL Server 2019 CU6)
-
Ak UDF odkazuje na šifrované stĺpce (pridané v SQL Server 2019 CU11)
-
Ak UDF obsahuje odkazy na WITH XMLNAMESPACES(pridané v SQL Server 2019 CU11)
-
Ak dotaz vyvolaný UDF obsahuje spoločné tabuľkové výrazy (CTE) (pridané v SQL Server 2019 CU11)
-
Ak definícia UDF obsahuje dočasné tabuľky alebo synonymá pre dočasné tabuľky (pridané v SQL Server 2022 CU1 a SQL Server 2019 CU19)
Po inovácii na SQL Server 2019 CU2, ale pred inováciou na SQL Server 2019 CU5 by ste mali prehodnotiť, či má UDF nárok na tvorbu zosúlaďovania. Ak to chcete urobiť, obnovte oprávnené skalárne používateľské súbory pomocou niektorého z týchto spôsobov:
-
Spustite sp_refreshsqlmodule pre príslušné skalárne UDF. Ďalšie informácie o tejto systémovej uloženej procedúre nájdete v téme sp_refreshsqlmodule (Transact-SQL).
-
Zmeňte alebo znova vytvorte existujúci skalárny formát UDF pomocou existujúcich definícií, povolení a nastavení vlastností. Ďalšie informácie nájdete v téme ALTER FUNCTION (Transact-SQL).
Nasledujúci príkaz vygeneruje skript na obnovenie metaúdajov existujúcich vložených skalárnych súborov 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
Poznámka: Po inovácii na SQL Server 2019 CU5 automaticky odvodíme vnorenie UDF počas kompilácie znova.
Riešenie
Tento problém je opravený v nasledujúcich kumulatívnych aktualizáciách pre SQL Server:
Každá nová kumulatívna aktualizácia pre SQL Server obsahuje všetky rýchle opravy a všetky opravy zabezpečenia, ktoré boli zahrnuté do predchádzajúcej kumulatívnej aktualizácie. Pozrite si najnovšie kumulatívne aktualizácie pre SQL Server:
Stav
Spoločnosť Microsoft potvrdila, že ide o problém v produktoch spoločnosti Microsoft, ktoré sú uvedené v časti Vzťahuje sa na.
Odkazy
Získajte informácie o terminológii , ktorú spoločnosť Microsoft používa na popis aktualizácií softvéru.