KB4538581 – RJEŠENJE: problemi s uvrštavanjem skalarnih UDF-ova u SQL Server 2022. i 2019.

Primjenjuje se na
SQL Server 2019 on Windows (all editions) SQL Server 2019 on Linux (all editions) SQL Server 2022 on Windows (all editions) SQL Server 2022 on Linux (all editions)

Simptomi

User-Defined Funkcije (UDF-ovi) koje su implementirane u Transact-SQL i koje vraćaju jednu podatkovnu vrijednost poznate su kao T-SQL skalarne User-Defined funkcije (UDF-ove).

Značajka skalarnog umetanja UDF-a predstavljena je u sustavu Microsoft SQL Server 2019. Ta značajka može poboljšati performanse upita koji pozivaju T-SQL skalarne UDF-ove u kojima je UDF izvršavanje glavno usko grlo. T-SQL skalarni UDF ulaganje automatski pretvara umetnute UDF-ove u relacijske izraze.

Ovo kumulativno ažuriranje (CU) obuhvaća nekoliko popravaka u sljedećim područjima za scenarije u kojima upit koji koristi skalarno umetanje UDF-a može vratiti poruku o pogrešci ili neočekivane rezultate:

  • Pogreška nepodudaranja vrste pojavljuje se ako je vraćena vrsta UDF-a (sql_variantdodana u SQL Server 2019 CU2).
  • Pozivanje UDF-a iz sp_executesql prekida izvršavanje (dodano u SQL Server 2019 CU2).
  • UDF-ovi koji se pozivaju na oznake bez pridružene GOTO naredbe vraćaju netočne rezultate (dodano u SQL Server 2019 CU2).
  • Do stanja nedostatka memorije i curenja memorije dolazi zbog vrlo velikih skalarnih UDF-ova (dodanih u SQL Server 2019 CU2).
  • Neinicijalizirane varijable koje se koriste u naredbama uvjeta (IF-ELSE) uzrokuju pogreške (dodano u SQL Server 2019 CU2).
  • Eksplicitna pogreška pretvorbe pojavljuje se ako UDF ima sql_variant parametar (dodan u SQL Server 2019 CU7).
  • Pogreška se pojavljuje ako se skalarna funkcija referencira CHECKSUM (dodano u SQL Server 2019 CU7).
  • Pozivanje UDF-a s mnogo ponovnih procjena skalarnih izraza može uzrokovati pogrešku nepopustljivog planera (dodano u SQL Server 2019 CU7).
    Napomena: rješenje tog problema ponekad može uzrokovati regresiju performansi. Da biste ublažili tu regresiju performansi, možete onemogućiti izvorni popravak tako da uključite oznaku praćenja (TF) 13156.
    Microsoft radi na rješenju za tu regresiju performansi koji će biti dostupan u budućem skupnom ažuriranju.
  • Pogreška se pojavljuje ako upit za referencu UDF-a koristi OPTION (RECOMPILE) (dodano u SQL Server 2019 CU7).
  • Do pogrešaka dozvola dolazi ako prikazi pozovu umetnute UDF-ove (dodano u SQL Server 2019 CU9).
  • Do kršenja pristupa query_tsql_scalar_udf_inlined dolazi ako se koristi XEvent (dodan u SQL Server 2019 CU9).
  • Do nedosljednog ponašanja dolazi jer skalarno umetanje UDF-a ne poštuje podsjetnik za QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n upit (dodan u sustavu SQL Server 2019 CU9).
  • Ugrađene UDF-ove sadrže agregacije koje mogu uzrokovati pogreške planera bez popuštanja (dodano u SQL Server 2019 CU9).
  • Pogreške nedostatka memorije događaju se zbog niza skalarnih operacija na istoj varijabli u uvjetnim blokovima (dodano u SQL Server 2019 CU9).
  • Nakon nadogradnje na CU9, do povrede pristupa dolazi ako objekt pozove skalarni umetnuti UDF (UDF1) koji ima skalarni umetnuti UDF (UDF2) koji se koristi kao ulazni parametar (dodan u SQL Server 2019 CU11).
  • Umetanje UDF-ova može uzrokovati pogreške i generirati kodove pogrešaka 6846, 1011 i 107 (dodano u SQL Server 2019 CU11).
  • Uvrštavanje UDF-ova koji se pokreću kao račun koji nije sysadmin može vratiti poruku o pogrešci "Dogodila se ozbiljna pogreška u vezi s trenutnom naredbom. Rezultate, ako ih ima, treba odbaciti" (dodano u SQL Server 2019 CU16).
  • Do povrede pristupa dolazi ako se unutar UDF-ova pozivaju privremene tablice pomoću sinonima (dodano u Microsoft SQL Server 2022 CU1 i SQL Server 2019 CU19).
  • Do povrede pristupa dolazi ako definicija UDF-a sadrži samo GOTO oznake i naredbu RETURN (dodano u SQL Server 2022 CU1 i SQL Server 2019 CU19).
  • Skalarni UDF vraća rezultate u različitim oblicima datuma i vremena kada je uključena značajka skalarnog umetanja UDF-a (dodano u SQL Server 2022 CU3 i SQL Server 2019 CU20).
  • Datoteka izvatka stanja sustava generira se ako upit koji ima GROUP BY uvjet koristi umetnute UDF-ove u naredbi SELECT bez agregacijske funkcije (dodano u SQL Server 2022 CU12 i SQL Server 2019 CU26).
  • Pogreška "Prekoračena je maksimalna razina pohranjene procedure, funkcije, okidača ili prikaza gniježđenja (ograničenje 32)" pojavljuje se ako je uključena značajka skalarnog umetanja UDF-a, čak i ako razina ugnježđivanja nije premašena (dodano u SQL Server 2022 CU12 i SQL Server 2019 CU26).
  • Do oštećenja memorije dolazi ako sqllang.dll!CProchdr::FDeriveInlineabilityOfScalarUdf je uključena značajka skalarnog umetanja UDF-a (dodana u SQL Server 2022 CU12 i SQL Server 2019 CU26).
  • Netočni rezultati nastaju zbog kombinacije skalarnog UDF uvlačenja i u istom upitu OPTION (RECOMPILE) (dodano u SQL Server 2022 CU17 i SQL Server 2019 CU31).

Ovo kumulativno ažuriranje blokira i ugradnju u sljedećim scenarijima:

  • Ako se UDF poziva na određene intrinzične funkcije (na primjer, @@ROWCOUNT), to bi moglo promijeniti rezultate ako je UDF umetnut (dodan u SQL Server 2019 CU2).
  • Ako se agregatne funkcije kao parametri prosljeđuju skalarnom UDF-u (dodano 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 (dodane u SQL Server 2019 CU4).
  • Ako UDF sadrži naredbu SELECT koja koristi uvjet, ORDER BY ali ne TOP 1 (dodano u SQL Server 2019 CU4).
  • Ako naredba SELECT izvršava dodjelu zajedno s uvjetom 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 naredbi (dodano u SQL Server 2019 CU5).
  • Ako se UDF poziva iz naredbe RETURN (dodane u SQL Server 2019 CU5).
  • Ako UDF referencira funkciju STRING_AGG (dodano u SQL Server 2019 CU5).
  • Ako se definicija UDF-a odnosi na udaljene tablice (dodane u SQL Server 2019 CU6).
  • Ako upit za pozivanje UDF-a koristi GROUPING SETS, CUBEor ROLLUP (dodano u SQL Server 2019 CU6).
  • Ako upit za pozivanje UDF-a sadrži varijablu koja se koristi kao parametar UDF-a za dodjelu (na primjer, SELECT @y=2, @x=UDF(@y)) (dodana u sustavu 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 sadrži uobičajene izraze tablice (CTE-ove) (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 ima naredbu SELECT zajedno s uvjetom DISTINCT o više stupaca dodjele (dodano u SQL Server 2022 CU4 i SQL Server 2019 CU20).
  • Ako UDF sadrži SELECT naredbu koja koristi TABLESAMPLE PERCENT uvjet i dodjele više varijabli (dodano u SQL Server 2022 CU7).
  • Ako INSERT upit postoji u tablici na koju se poziva indeksirani prikaz koji sadrži UDF (dodan u SQL Server 2022 CU12 i SQL Server 2019 CU26).

Nakon nadogradnje na SQL Server 2019 CU2, ali prije nadogradnje na SQL Server 2019 CU5, trebali biste ponovno procijeniti ispunjava li UDF uvjete za umetanje. Da biste to učinili, na jedan od sljedećih načina osvježite skalarne UDF-ove koji ispunjavaju uvjete:

  • Pokrenite sp_refreshsqlmodule za primjenjive skalarne UDF-ove. Dodatne informacije o toj spremljenoj proceduri sustava potražite u članku sp_refreshsqlmodule (Transact-SQL).
  • Izmijenite ili ponovno stvorite postojeće skalarne UDF-ove pomoću postojećih definicija, dozvola i postavljenih svojstava. Dodatne informacije potražite u članku ALTER FUNCTION (Transact-SQL).

Sljedeća naredba generira skriptu za osvježavanje metapodataka svih postojećih skalarnih UDF-ova s inlineranim nivoom:


/*

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, nastavit ćemo s automatskim izvođenjem UDF inlineability tijekom kompilacije.

Rješenje

Taj je problem riješen u sljedećim kumulativnim ažuriranjima za SQL Server:

O kumulativnim ažuriranjima za SQL Server

Svako novo kumulativno ažuriranje za SQL Server sadrži sve hitne popravke i 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

Saznajte više o terminologiji koju Microsoft upotrebljava za opisivanje softverskih ažuriranja.