Simptome
User-Defined funkcije (UDF-ove) koje se primenjuju u Transact-SQL i koje vraćaju jednu vrednost podataka poznate su kao T-SQL Scalar User-Defined Funkcije (UDF-ove).
Funkcija "UDF UDF inlining" uvedena je u programu Microsoft SQL Server 2019. Ova funkcija može da poboljša performanse upita koji pozivaju T-SQL Scalar UDF-ove u kojima je UDF izvršavanje glavno usko grlo. T-SQL Scalar UDF umetanje automatski transformiše nelinearne UDF-ove u relacione izraze.
Ova kumulativna ispravka (CU) uključuje nekoliko ispravki u sledećim oblastima za scenarije u kojima upit koji koristi Scalar UDF nalaženje može da vrati poruku o grešci ili neočekivane rezultate:
-
Greška nepodudaranja tipova se pojavljuje ako je povratni tip UDF-a sql_variant (dodat u SQL Server 2019 CU2).
-
UDF pozivanje izsp_executesqlotkazuje izvršavanje (dodato u SQL Server 2019 CU2).
-
UDF datoteke koje upućuju na oznake bez povezane GOTO vraćaju netačne rezultate (dodate u SQL Server 2019 CU2).
-
Nema dovoljno memorije i curenja memorije dolazi zbog veoma velikih UDF-SQL Server 2019.
-
Nepokrenute promenljive koje se koriste u izrazima uslova (IF-ELSE) uzrokuju greške (dodate u SQL Server 2019 CU2).
-
Do eksplicitne greške pri konverziji dolazi ako UDF ima sql_variantparametar (dodat u programu SQL Server 2019 CU7).
-
Do greške dolazi ako niska funkcija upućuje na CHECKSUM(dodato u programu SQL Server 2019 CU7).
-
UDF pozivanje koje ima mnogo ponovnih procena izraza u obliku skarlarnog izraza može da izazove grešku planer koji se ne daje (dodato u SQL Server 2019 CU7).
Napomena: Popravka ovog problema ponekad može da izazove regresiju performansi. Da biste umanjili regresiju performansi, možete onemogućiti originalnu ispravku tako što ćete uključiti zastavicu za praćenje (TF) 13156.
Microsoft radi na rešenju za regresiju performansi koje će biti dostupne u budućim cu.
-
Do greške dolazi ako UDF upit za referenciranje koristi OPTION (RECOMPILE)(dodat u programu SQL Server 2019 CU7).
-
Do grešaka sa dozvolama dolazi ako prikazi pozivaju ugrađene UDF-ove (dodate u SQL Server 2019 CU9).
-
Kršenja pravila pristupa se javljajuquery_tsql_scalar_udf_inlinedse koristi XEvent (dodat u programu SQL Server 2019 CU9).
-
Do nedoslednog ponašanja dolazi zato što excel UDF inlining ne poštuje QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_nupita (dodato u SQL Server 2019 CU9).
-
UDF-ove koji se ulizuju sadrže agregacije koje mogu dovesti do grešaka u planeru koji se ne daje (dodato u programu SQL Server 2019 CU9).
-
Do grešaka sa nedostupnom memorijom dolazi zbog niza skalarnih operacija na istoj promenljivoj u uslovnim blokovima (dodato u SQL Server 2019 CU9).
-
Kada izvršite nadogradnju na CU9, do kršenja pravila pristupa dolazi ako objekat poziva scalar neposredni UDF (UDF1) koji ima scalar neposredni UDF (UDF2) koji se koristi kao ulazni parametar (dodat u programu SQL Server 2019 CU11).
-
Upisivanje UDF-ova može dovesti do grešaka i generisati kodove grešaka 6846, 1011 i 107 (dodate u programu SQL Server 2019 CU11).
-
Ako umetnete UDF-ove koji se pokreću kao nalog koji nije sysadmin, možda ćete vratiti poruku o grešci "Došlo je do ozbiljne greške na trenutnoj komandi. Rezultati bi, ako ih ima, trebalo odbaciti" (dodati u SQL Server CU16 2019).
-
Kršenje pristupa se javlja ako se privremene tabele pozivaju unutar UDF-a pomoću sinonima (dodatih u Microsoft SQL Server 2022 CU1 i SQL Server 2019 CU19).
-
Do kršenja pravila pristupa dolazi ako UDF definicija sadrži samo GOTO oznake iRETURN izjavu (dodate u SQL Server 2022 CU1 i SQL Server 2019 CU19).
-
Scalar UDF daje rezultate u različitim formatima datuma i vremena kada je funkcija za upisivanje Scalar UDF-a uključena (dodata u programima SQL Server 2022 CU3 i SQL Server 2019 CU20).
-
Datoteka stanja se generiše ako upit koji ima odredbu GROUP BY koristi uvučene UDF-ove u SELECT izrazu bez agregatne funkcije (dodate u programima SQL Server 2022 CU12 i SQL Server 2019 CU26).
-
Greška "Premašena je maksimalna uskladištena procedura, funkcija, okidač ili prikaz nivoa ugnežđivanja (ograničenje 32)" pojavljuje se ako je funkcija UDF ugnežđivanja uključena, čak i ako se nivo ugnežđivanja ne premaši (dodat u programima SQL Server 2022 CU12 i SQL Server 2019 CU26).
-
Oštećenje memorije se sqllang.dll!CProchdr::FDeriveInlineabilityOfScalarUdf u programu sqllang.dll!CProchdr::FDeriveInlineabilityOfScalarUdf ako je funkcija za upisivanje UDF-a u programima Scalar uključena (dodata u programima SQL Server 2022 CU12 i SQL Server 2019 CU26).
Ova kumulativna ispravka takođe blokira upisivanje u sledeće scenarije:
-
Ako UDF upućuje na određene interne funkcije (na primer @@ROWCOUNT) koje mogu da promene rezultate kada je UDF naveden (dodat u programu SQL Server 2019 CU2).
-
Kada se agregatne funkcije prosleđuju kao parametri u skupi UDF (dodati u SQL Server 2019 CU2).
-
Ako UDF upućuje na ugrađene prikaze (na primer: OBJECT_ID) (dodato u programu SQL Server 2019 CU2).
-
Ako UDF koristi XML metode (dodat u programu SQL Server 2019 CU4).
-
Ako UDF sadrži izraz SELECTkoji koristi odredbuORDER BY, ali ne i TOP 1(dodat u SQL Server 2019 CU4).
-
AkoSELECT izvršava zadatak zajedno sa odredbom ORDER BY (na primer, SELECT @x = @x +1 FROM table ORDER BY column_name) (dodata u SQL Server 2019 CU4).
-
Ako UDF sadrži više instrukcija RETURN (dodato u SQL Server 2019 CU5).
-
Ako se UDF poziva iz RETURN (dodat u SQL Server 2019 CU5).
-
Ako UDF upućuje na funkciju STRING_AGG (dodato u programu SQL Server 2019 CU5).
-
Ako definicija UDF-a upućuje na udaljene tabele (dodate u SQL Server 2019 CU6).
-
Ako upit za UDF pozivanje koristi GROUPING SETS, CUBEili ROLLUP (dodat u programu SQL Server 2019 CU6).
-
Ako upit za UDF pozivanje sadrži promenljivu koja se koristi kao UDF parametar za dodelu (na primer, SELECT @y=2, @x=UDF(@y)) (dodato u programu SQL Server 2019 CU6).
-
Ako UDF upućuje na šifrovane kolone (dodate u SQL Server 2019 CU11).
-
Ako UDF sadrži reference za WITH XMLNAMESPACES(dodato u SQL Server 2019 CU11).
-
Ako upit koji poziva UDF ima uobičajene izraze tabele (CTE) (dodat u SQL Server 2019 CU11).
-
Ako UDF definicija sadrži privremene tabele ili sinonime za privremene tabele (dodate u programu SQL Server 2022 CU1 i SQL Server 2019 CU19).
-
Ako UDF definicija imaSELECTizraz zajedno saDISTINCTodredbom u više kolona sa dodelom (dodata u verzijama SQL Server 2022 CU4 i SQL Server 2019 CU20).
-
Ako UDF sadrži izraz SELECT koji koristi odredbu TABLESAMPLE PERCENT i više promenljivih dodela (dodato u programu SQL Server 2022 CU7).
-
Ako INSERT upit postoji u tabeli na koju upućuje indeksirani prikaz koji sadrži UDF (dodat u programu SQL Server 2022 CU12 i SQL Server 2019 CU26).
Kada izvršite nadogradnju na SQL Server 2019 CU2, ali pre nadogradnje na SQL Server 2019 CU5, trebalo bi ponovo da proverite da li UDF ispunjava uslove za usmeravanje. Da biste to uradili, osvežite UDF-ove koji ispunjavaju uslove putem bilo kojih od sledećih metoda:
-
Pokrenite sp_refreshsqlmodule za primenljive UDF-ove. Više informacija o ovoj uskladištenoj proceduri sistema potražite u članku sp_refreshsqlmodule (Transact-SQL).
-
Izmenite ili ponovo kreirajte postojeći UDF u obliku scalara pomoću postojećih definicija, dozvola i postavljanja svojstava. Više informacija potražite u članku ALTER FUNCTION (Transact-SQL).
Sledeća komanda generiše skriptu da bi osvežila metapodatke svih postojećih uvučenih uDF-ove:
/*
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: Kada izvršite nadogradnju na SQL Server 2019 CU5, nastavićemo sa automatskim izvođenjem UDF umetnute mogućnosti tokom prevođenja.
Rezoluciju
Ovaj problem je rešen u sledećim kumulativnim ispravkama za SQL Server:
Svaka nova kumulativna ispravka za SQL Server sadrži sve hitne ispravke i sve bezbednosne ispravke koje su uključene u prethodnu kumulativnu ispravku. Pogledajte najnovije kumulativne ispravke za SQL Server:
Status
Microsoft je potvrdio da je ovo problem u Microsoft proizvodima koji su navedeni u odeljku "Odnosi se na".
Reference
Saznajte više o terminologiji koju Microsoft koristi za opisivanja softverskih ispravki.