Příznaky
funkce User-Defined (UDF), které jsou implementované v jazyce Transact-SQL a vracejí jednu datovou hodnotu, se označují jako skalární funkce User-Defined (UDF) T-SQL.
Microsoft SQL Server 2019 představil funkci skalárního vkládání UDF. Tato funkce může zlepšit výkon dotazů, které vyvolávají skalární funkce definované uživatelem T-SQL, ve kterých je hlavním kritickým bodem spuštění UDF. Vkládání skalárních definovaných funkcí T-SQL automaticky transformuje vložené funkce definované uživatelem na relační výrazy.
Tato kumulativní aktualizace obsahuje několik oprav v následujících oblastech pro scénáře, ve kterých dotaz, který používá skalární vkládání UDF, může vrátit chybu nebo neočekávané výsledky:
-
Chyba neshody typů, pokud je návratovým typem UDF sql_variant (přidaná v SQL Server 2019 CU2)
-
Volání uživatelem uživatelem zsp_executesql přeruší provádění (přidáno v SQL Server 2019 CU2)
-
Funkce definované uživatelem odkazující na popisky bez přidruženého příkazu GOTO vrací nesprávné výsledky (přidány v SQL Server 2019 CU2)
-
K nedostatku paměti a nevracení paměti dochází kvůli velmi velkým skalárním funkcím definovaným uživatelem (přidáno v SQL Server 2019 CU2).
-
Neinicializované proměnné použité v příkazech podmínky (IF-ELSE) způsobují chyby (přidané v SQL Server 2019 CU2)
-
Explicitní chyba převodu, pokud má funkce UDF parametr sql_variant(přidaná v SQL Server 2019 CU7)
-
K chybě dochází, když skalární funkce odkazuje na CHECKSUM(přidáno v SQL Server 2019 CU7).
-
Vyvolání UDF s velkým počtem opětovných vyhodnocení skalárních výrazů může způsobit chybu nevýrazného plánovače (přidaná v SQL Server 2019 CU7).
Poznámka: Oprava tohoto problému může někdy způsobit regresi výkonu. Pokud chcete tuto regresi výkonu zmírnit, můžete původní opravu zakázat zapnutím příznaku trasování (TF) 13156.
Microsoft pracuje na opravě této regrese výkonu, která bude k dispozici v budoucí cu.
-
K chybě dochází, když dotaz UDF odkazující na OPTION (RECOMPILE)(přidaný v SQL Server 2019 CU7)
-
K chybám oprávnění dochází, když zobrazení vyvolávají vložené funkce definované uživatelem (přidané v SQL Server 2019 CU9).
-
K narušení přístupu dochází při použití query_tsql_scalar_udf_inlinedXEvent (přidané v cu9 SQL Server 2019).
-
Nekonzistentní chování kvůli tomu, že skalární UDF inlining nerespektuje QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_nnápovědu dotazu (přidáno v SQL Server 2019 CU9)
-
Vložené funkce definované uživatelem obsahují agregace, které můžou způsobit chyby plánovače, které se negenerují (přidané v SQL Server CU9 2019).
-
Chyby způsobené nedostatkem paměti kvůli posloupnosti skalárních operací se stejnou proměnnou v podmíněných blocích (přidané v SQL Server 2019 CU9)
-
K narušení přístupu může dojít, když objekt vyvolá skalární inlineable UDF (UDF1) se skalárním vloženým UDF (UDF2), který se použije jako vstupní parametr po upgradu na CU9 (přidaný v SQL Server 2019 CU11).
-
Vkládání funkcí definovaných uživatelem může způsobit chyby s kódy chyb 6846, 1011 a 107 (přidané v SQL Server 2019 CU11).
-
Vkládání funkcí definovaných uživatelem spuštěných jako účet jiného uživatele než sysadmin může vyvolat chybu "V aktuálním příkazu došlo k závažné chybě. Případné výsledky by měly být zahozeny" (přidáno v SQL Server 2019 CU16)
-
K narušení přístupu dochází při vyvolání dočasných tabulek uvnitř funkcí UDF pomocí synonym (přidaných v Microsoft SQL Server 2022 CU1 a SQL Server 2019 CU19).
-
K narušení přístupu dochází, pokud definice UDF obsahuje pouze popisky GOTO a příkazRETURN (přidaný v SQL Server 2022 CU1 a SQL Server 2019 CU19).
Tato kumulativní aktualizace také blokuje vkládání v následujících scénářích:
-
Pokud funkce definovaná uživatelem odkazuje na určité vnitřní funkce (například @@ROWCOUNT), které můžou změnit výsledky při jejich vkládání (přidané v SQL Server 2019 CU2)
-
Když jsou agregační funkce předány jako parametry do skalárního definovaného uživatele (přidáno v SQL Server 2019 CU2)
-
Pokud funkce definovaná uživatelem odkazuje na předdefinovaná zobrazení (například: OBJECT_ID) (přidaná v SQL Server 2019 CU2)
-
Pokud funkce definovaná uživatelem používá metody XML (přidané v SQL Server 2019 CU4),
-
Pokud funkce definovaná uživatelem obsahuje SELECTs ORDER BYa bez TOP 1(přidaná v SQL Server 2019 CU4)
-
Pokud dotazSELECT provede přiřazení ve spojení s klauzulí ORDER BY (například SELECT @x = @x +1 FROM table ORDER BY column_name) (přidáno v SQL Server 2019 CU4).
-
Pokud funkce definovaná uživatelem obsahuje více příkazů RETURN (přidáno v SQL Server CU5 SQL Server 2019)
-
Pokud je funkce definovaná uživatelem volána z příkazu RETURN (přidaná v SQL Server 2019 CU5)
-
Pokud funkce definovaná uživatelem odkazuje na funkci STRING_AGG (přidaná v SQL Server 2019 CU5)
-
Pokud definice UDF odkazuje na vzdálené tabulky (přidané v SQL Server 2019 CU6),
-
Pokud dotaz volající UDF používá GROUPING SETS, CUBEnebo ROLLUP (přidaný v SQL Server 2019 CU6)
-
Pokud dotaz volající UDF obsahuje proměnnou, která se používá jako parametr UDF pro přiřazení (například SELECT @y=2, @x=UDF(@y)) (přidaná v SQL Server 2019 CU6)
-
Pokud funkce definovaná uživatelem odkazuje na šifrované sloupce (přidáno v SQL Server 2019 CU11)
-
Pokud funkce definovaná uživatelem obsahuje odkazy na WITH XMLNAMESPACES(přidáno v SQL Server 2019 CU11)
-
Pokud dotaz vyvolávající UDF obsahuje CTE (Common Table Expressions) (přidané v SQL Server 2019 CU11)
-
Pokud definice UDF obsahuje dočasné tabulky nebo synonyma pro dočasné tabulky (přidané v SQL Server 2022 CU1 a SQL Server 2019 CU19)
Po upgradu na SQL Server 2019 CU2, ale před upgradem na SQL Server 2019 CU5 byste měli znovu vyhodnotit, jestli je UDF způsobilý pro vkládání. Provedete to tak, že aktualizujete oprávněné skalární funkce definované uživatelem některou z následujících metod:
-
Spusťte sp_refreshsqlmodule pro příslušné skalární funkce definované uživatelem. Další informace o této systémové uložené procedurě najdete v tématu sp_refreshsqlmodule (Transact-SQL).
-
Umožňuje změnit nebo znovu vytvořit existující skalární definovanou funkci definovanou uživatelem pomocí existujících definic, oprávnění a vlastností sady. Další informace najdete v tématu ALTER FUNCTION (Transact-SQL).
Následující příkaz vygeneruje skript pro aktualizaci metadat existujících vnořených skalárních funkcí 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 upgradu na SQL Server 2019 CU5 znovu automaticky odvodíme inlineability UDF během kompilace.
Řešení
Tento problém je opravený v následujících kumulativních aktualizacích pro SQL Server:
Každá nová kumulativní aktualizace pro SQL Server obsahuje všechny opravy hotfix a všechny opravy zabezpečení, které byly součástí předchozí kumulativní aktualizace. Podívejte se na nejnovější kumulativní aktualizace pro SQL Server:
Stav
Společnost Microsoft potvrdila, že se jedná o problém v produktech společnosti Microsoft, které jsou uvedeny v části Platí pro.
Odkazy
Seznamte se s terminologií , kterou Microsoft používá k popisu aktualizací softwaru.