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.
V Microsoftu SQL Server 2019 byla představena funkce 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 (CU) 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 chybovou zprávu nebo neočekávané výsledky:
-
K chybě neshody typů dojde v případě, že návratovým typem UDF je sql_variant (přidaný v SQL Server 2019 CU2).
-
Vyvolání UDF zsp_executesqlzruší provádění (přidáno v SQL Server 2019 CU2).
-
Funkce definované uživatelem, které odkazují na popisky bez přidruženého příkazu GOTO , vrátí nesprávné výsledky (přidané v SQL Server 2019 CU2).
-
K nedostatku paměti a nevracení paměti dochází kvůli velmi velkým skalárním definovaným funkcím (přidaným v SQL Server 2019 CU2).
-
Neinicializované proměnné, které se používají v příkazech podmínky (IF-ELSE), způsobují chyby (přidané v SQL Server 2019 CU2).
-
K explicitní chybě převodu dojde v případě, že má UDF parametr sql_variant(přidaný v SQL Server CU7 2019).
-
K chybě dojde, pokud skalární funkce odkazuje na CHECKSUM(přidáno v SQL Server CU7 2019).
-
Vyvolání UDF s mnoha opětovným vyhodnocením skalárních výrazů může způsobit chybu negenerující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ě dojde, pokud dotaz, na který odkazuje UDF, používá OPTION (RECOMPILE)(přidaný v SQL Server CU7 2019).
-
K chybám oprávnění dochází, pokud zobrazení vyvolávají vložené funkce definované uživatelem (přidané v SQL Server 2019 CU9).
-
K narušení přístupu dochází, pokud se používáquery_tsql_scalar_udf_inlinedXEvent (přidaná v SQL Server 2019 CU9).
-
K nekonzistentnímu chování dochází, protože skalární UDF inlining nerespektuje QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_nnápovědu dotazu (přidanou 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 2019 CU9).
-
K chybám kvůli nedostatku paměti dochází 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).
-
Po upgradu na CU9 dojde k narušení přístupu, pokud objekt vyvolá skalární vložený UDF (UDF1), který má skalární vložený UDF2 (UDF2), který se používá jako vstupní parametr (přidaný v SQL Server 2019 CU11).
-
Vkládání funkcí definovaných uživatelem může způsobit chyby a generovat kódy chyb 6846, 1011 a 107 (přidané v SQL Server 2019 CU11).
-
Vložené funkce definované uživatelem, které se spouští jako účet jiného uživatele než sysadmin, můžou vrátit chybovou zprávu "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í v případě, že jsou v UDF vyvolány dočasné tabulky 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).
-
Skalární funkce definované uživatelem vrátí výsledky v různých formátech data a času, když je zapnutá funkce skalární vkládání UDF (přidaná v SQL Server 2022 CU3 a SQL Server 2019 CU20).
-
Soubor s výpisem paměti se vygeneruje, pokud dotaz s klauzulí GROUP BY používá vložené funkce definované uživatelem v příkazu SELECT bez agregační funkce (přidané v SQL Server 2022 CU12 a SQL Server 2019 CU26).
-
K chybě "Maximální uložená procedura, funkce, trigger nebo úroveň vnoření zobrazení byla překročena (limit 32)" dojde v případě, že je zapnutá funkce skalárního vkládání UDF, a to i v případě, že úroveň vnoření není překročena (přidána v SQL Server 2022 CU12 a SQL Server 2019 CU26).
-
K poškození paměti dochází v sqllang.dll!CProchdr::FDeriveInlineabilityOfScalarUdf , pokud je zapnutá funkce skalárního vkládání UDF (přidaná v SQL Server 2022 CU12 a SQL Server 2019 CU26).
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 vkládání funkce definované uživatelem (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 příkaz SELECT, který používá klauzuliORDER BY, ale ne TOP 1(přidaný v SQL Server 2019 CU4).
-
Pokud příkazSELECT provede přiřazení společně s klauzulí ORDER BY (například SELECT @x = @x +1 FROM table ORDER BY column_name) (přidanou v SQL Server 2019 CU4).
-
Pokud funkce definovaná uživatelem obsahuje více příkazů RETURN (přidaných v SQL Server CU5 2019).
-
Pokud je funkce definovaná uživatelem volána z příkazu RETURN (přidáno v SQL Server CU5 SQL Server 2019).
-
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)
-
Pokud má definice UDF příkazSELECTspolečně s klauzulíDISTINCTve více sloupcích přiřazení (přidáno v SQL Server 2022 CU4 a SQL Server 2019 CU20).
-
Pokud funkce definovaná uživatelem obsahuje příkaz SELECT , který používá klauzuli TABLESAMPLE PERCENT a více přiřazení proměnných (přidáno v SQL Server 2022 CU7).
-
Pokud INSERT dotaz existuje v tabulce, na kterou odkazuje indexované zobrazení obsahující UDF (přidané v SQL Server 2022 CU12 a SQL Server 2019 CU26).
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 všech 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 budeme pokračovat v automatickém odvozování nelineability 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.