Simptomi
User-Defined (UDFs) implementirane u Transact-SQL i koje vraćaju jednu vrijednost podataka nazivaju se T-SQL Scalar User-Defined Functions (UDFs).
Microsoft SQL Server 2019 uveo je značajku Scalar UDF Inlining. Ta značajka može poboljšati performanse upita koji pozivaju T-SQL Scalar UDF-ove, u kojima je izvršavanje UDF-a glavno usko grlo. T-SQL Scalar UDF Inlining automatski pretvara nelinearne UDF-ove u relacijske izraze.
Kumulativno ažuriranje obuhvaća nekoliko popravaka u sljedećim područjima za scenarije u kojima upit koji koristi Scalar UDF inlining može vratiti pogrešku ili neočekivane rezultate:
-
Pogreška nepodudaranje vrsta pojavljuje se ako je vrsta povrata UDF-a sql_variant (dodana u SQL Server 2019 CU2).
-
UDF pozivanje izsp_executesql prekida izvršavanje (dodano u SQL Server 2019 CU2).
-
UDFs koji referencira oznake bez pridružene GOTO vraćaju netočne rezultate (dodane u SQL Server 2019 CU2).
-
Uvjeti nedostatka memorije i curenja memorije pojavljuju se zbog vrlo velikih ljuskastih UDFs-ova (dodanih u SQL Server 2019. CU2).
-
Neinicijalizirane varijable koje se koriste u naredbama uvjeta (IF-ELSE) uzrokuju pogreške (dodane u SQL Server 2019. CU2).
-
Eksplicitna pogreška pretvorbe pojavljuje se ako UDF sql_variantparametar (dodan u SQL Server 2019 CU7).
-
Pogreška se pojavljuje kada se skalarni funkcija referencira CHECKSUM(dodano u SQL Server 2019 CU7).
-
Pozivanje UDF-a s velikim brojem ponovnih procjena skaliranja izraza može uzrokovati pogrešku planera koji ne daje dobit (dodana u SQL Server 2019. CU7).
Napomena: rješenje tog problema ponekad može uzrokovati regresij performansi. Da biste ublažili regresij performansi, možete onemogućiti izvorni popravak uključivanjem zastavice praćenja (TF) 13156.
Microsoft radi na rješenju tog regresije performansi koja će biti dostupna u budućem cu.
-
Pogreška se pojavljuje kada UDF referencira upit koristi OPTION (RECOMPILE)(dodan u SQL Server 2019 CU7).
-
Pogreške dozvola pojavljuju se kada se prikazi pozivaju na umetnuti UDFs (dodani u SQL Server 2019 CU9).
-
Do kršenja prava pristupa dolaziquery_tsql_scalar_udf_inlinedXEvent (dodan u SQL Server 2019 CU9).
-
Nedosljedno ponašanje pojavljuje se zbog Scalar UDF inlining ne poštujući QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_nupit podsjetnik (dodan u SQL Server 2019 CU9).
-
Strukturiranje UDF-ova sadrži agregacije koje mogu uzrokovati pogreške planera koji ne rezultiraju prinosima (dodane u SQL Server 2019. CU9).
-
Pogreške koje nisu u memoriji pojavljuju se zbog niza skalarnih operacija na istoj varijabli u uvjetnim blokovima (dodano u SQL Server 2019. CU9).
-
Do kršenja prava pristupa dolazi kada objekt pozove skalarni nelinearni UDF (UDF1) koji ima skalarni UDF (UDF2) koji se koristi kao ulazni parametar nakon nadogradnje na CU9 (dodan u SQL Server 2019 CU11).
-
Strukturiranje UDFs-ova može uzrokovati pogreške i generirati kodove pogrešaka 6846, 1011 i 107 (dodano u SQL Server 2019 CU11).
-
Ulining UDFs that run as the non-sysadmin account might return the error message, "A severe error occurred on the current command. Rezultate, ako postoje, treba odbaciti" (dodano u SQL Server 2019. CU16).
-
Do kršenja prava pristupa dolazi kada se privremene tablice pozivaju unutar UDFs-ova pomoću sinonima (dodanih u Microsoft SQL Server 2022 CU1 i SQL Server 2019 CU19).
-
Do kršenja prava pristupa dolazi ako definicija UDF-a sadrži samo GOTO oznake iRETURN naredbu (dodanu u SQL Server 2022 CU1 i SQL Server 2019 CU19).
-
Scalar UDF vraća rezultate u različitim oblicima datuma i vremena kada je omogućena značajka UDF inliniranja Scalar (dodana u SQL Server 2022 CU3 i SQL Server 2019 CU20).
Kumulativno ažuriranje blokira i strukturiranje u sljedećim scenarijima:
-
Ako se UDF poziva na određene intrinzne funkcije (na primjer, @@ROWCOUNT) koje mogu izmijeniti rezultate kada su ucrtane (dodane u SQL Server 2019. CU2).
-
Kada se agregacijske funkcije prosljeđuju kao parametri u skalarni UDF (dodan u SQL Server 2019.CU2).
-
Ako UDF referencira ugrađene prikaze (na primjer: OBJECT_ID) (dodano u SQL Server 2019. CU2).
-
Ako UDF koristi XML metode (dodano u SQL Server 2019 CU4).
-
Ako UDF sadrži SELECTkoja koristi uvjetORDER BY, ali ne i TOP 1(dodan u SQL Server 2019 CU4).
-
AkoSELECT izvodi zadatak zajedno s ORDER BY (na primjer, SELECT @x = @x +1 FROM table ORDER BY column_name) (dodano u SQL Server 2019. CU4).
-
Ako UDF sadrži više RETURN (dodano u SQL Server 2019. CU5).
-
Ako se UDF poziva iz naredbe RETURN (dodan u SQL Server 2019 CU5).
-
Ako UDF referencira funkciju STRING_AGG (dodano u SQL Server 2019. CU5).
-
Ako definicija UDF-a upućuje na udaljene tablice (dodano u SQL Server 2019. CU6).
-
Ako upit za pozivanje UDF-a koristi GROUPING SETS, CUBEili ROLLUP (dodan u SQL Server 2019. CU6).
-
Ako upit za pozivanje UDF-a sadrži varijablu koja se koristi kao parametar UDF za dodjelu (na primjer, SELECT @y=2, @x=UDF(@y)) (dodano u SQL Server 2019. CU6).
-
Ako UDF referencira šifrirane stupce (dodano u SQL Server 2019. CU11).
-
Ako UDF sadrži reference na WITH XMLNAMESPACES(dodano u SQL Server 2019. CU11).
-
Ako upit koji poziva UDF ima izraze uobičajene tablice (CTE) (dodane u SQL Server 2019.CU11).
-
Ako definicija UDF-a sadrži privremene tablice ili sinonime za privremene tablice (dodano u SQL Server 2022 CU1 i SQL Server 2019 CU19).
-
Ako definicija UDF-a sadržiSELECTuz uvjetDISTINCTna više stupaca zadataka (dodan u SQL Server 2022 CU4 i SQL Server 2019 CU20).
Nakon nadogradnje na SQL Server 2019 CU2, ali prije nadogradnje na SQL Server 2019 CU5 trebali biste ponovno procijeniti ispunjava li UDF uvjete za strukturiranje. Da biste to učinili, osvježite kvalificirane skalirane UDFs-ove na jedan od sljedećih načina:
-
Pokrenite sp_refreshsqlmodule za primjenjive skalarni UDFs. Dodatne informacije o pohranjenoj proceduri sustava potražite u članku sp_refreshsqlmodule (Transact-SQL).
-
Izmijenite ili ponovno stvorite postojeći skalarni UDF pomoću postojećih definicija, dozvola i postavite svojstva. Dodatne informacije potražite u članku ALTER FUNCTION (Transact-SQL).
Sljedeća naredba generira skriptu za osvježavanje metapodataka postojećih umetnutih skalarnih UDFs-ova:
/*
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
Napomena: nakon nadogradnje na SQL Server 2019 CU5 automatski ćemo izvesti nelineabilnost UDF-a tijekom ponovnog sastavljanja.
Rješenje
Taj je problem riješen u sljedećim kumulativnim ažuriranjima za SQL Server:
Svako novo kumulativno ažuriranje za SQL Server sadrži sve hitne popravke i sve sigurnosne popravke koji su obuhvaćeni prethodnim kumulativnim ažuriranjem. Pogledajte najnovija kumulativna ažuriranja za SQL Server:
Status
Microsoft je potvrdio da je to problem u Microsoftovim proizvodima koji su navedeni u odjeljku "Odnosi se na".
Reference
Informirajte se o terminologiji koju Microsoft koristi za opisivanje softverskih ažuriranja.