Hatókör
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)

Jelenségek

User-Defined Transact-SQL-ben implementált és egyetlen adatértéket visszaadó függvényeket T-SQL skaláris User-Defined függvényeknek (UDF-eknek) nevezzük. 

A Skaláris UDF-körvonalazási funkció a Microsoft SQL Server 2019-ben jelent meg. Ez a funkció javíthatja az olyan T-SQL skaláris UDF-eket meghívó lekérdezések teljesítményét, amelyekben az UDF végrehajtása a fő szűk keresztmetszet. A T-SQL skaláris UDF inlining automatikusan relációs kifejezésekké alakítja át a beágyazott UDF-eket. 

Ez az összegző frissítés (CU) az alábbi területeken számos javítást tartalmaz olyan forgatókönyvek esetében, amelyekben a skaláris UDF-formázást használó lekérdezés hibaüzenetet vagy váratlan eredményeket adhat vissza:

  • Típuseltérési hiba akkor fordul elő, ha az UDF visszatérési típusa egy sql_variant (SQL Server 2019 CU2-ben van hozzáadva).

  • Asp_executesqlUDF-hívása megszakítja a végrehajtást (SQL Server 2019 CU2-ben van hozzáadva).

  • Azok az UDF-ek, amelyek társított GOTO parancs nélküli címkékre hivatkoznak, helytelen eredményeket adnak vissza (SQL Server 2019 CU2-ben lettek hozzáadva).

  • A memóriakimaradás és a memóriavesztés a nagyon nagy skaláris UDF-ek miatt fordul elő (a 2019 CU2 SQL Server része).

  • A feltételben (IF-ELSE) használt nem inicializált változók hibát okoznak (a 2019 CU2 SQL Server-ben lettek hozzáadva).

  • Explicit konverziós hiba akkor fordul elő, ha egy UDF sql_variantparaméterrel rendelkezik (SQL Server 2019 CU7-ben lett hozzáadva).

  • Hiba akkor fordul elő, ha a skaláris függvény CHECKSUMhivatkozik (a SQL Server 2019 CU7-ben van hozzáadva).

  • A sok skaláris kifejezés újraértékelésével rendelkező UDF-hívás nem eredményező ütemezőhibát okozhat (SQL Server 2019 CU7-ben lett hozzáadva).

    Megjegyzés: A probléma javítása időnként teljesítményregressziót okozhat. A teljesítményregresszió csökkentése érdekében letilthatja az eredeti javítást a nyomkövetési jelző (TF) 13156 bekapcsolásával.

    A Microsoft dolgozik a teljesítményregresszió javításán, amely egy későbbi cu-ban lesz elérhető.

  • Hiba történik, ha az UDF-hivatkozó lekérdezés OPTION (RECOMPILE)használ (a 2019 CU7 SQL Server van hozzáadva).

  • Engedélyhibák akkor fordulnak elő, ha a nézetek beágyazott UDF-eket hívnak meg (SQL Server 2019 CU9-ben hozzáadva).

  • Hozzáférési szabálysértések akkor fordulnak elő, ha aquery_tsql_scalar_udf_inlinedXEventet használják (a SQL Server 2019 CU9-ben van hozzáadva).

  • Az inkonzisztens viselkedés azért fordul elő, mert a skaláris UDF-formázás nem tartja tiszteletben a QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_nlekérdezési tippet (a 2019 CU9 SQL Server van hozzáadva).

  • A beágyazott UDF-ek olyan aggregációkat tartalmaznak, amelyek nem eredményező ütemezőhibákat okozhatnak (SQL Server 2019 CU9-ben lett hozzáadva).

  • Memóriahiba lép fel a feltételes blokkok ugyanazon változóján végzett skaláris műveletek sorozata miatt (SQL Server 2019 CU9-ben hozzáadva).

  • A CU9-re való frissítés után hozzáférés-megsértés lép fel, ha egy objektum skaláris beágyazott UDF-et (UDF1) hív meg, amely skaláris beágyazott UDF-et (UDF2) használ bemeneti paraméterként (SQL Server 2019 CU11-ben).

  • Az UDF-ek felvázolása hibákat okozhat, és a 6846-os, 1011-os és 107-os hibakódokat eredményezheti (a 2019 CU11 SQL Server-ben van hozzáadva).

  • A nem sysadmin fiókként futó UDF-ek a következő hibaüzenetet kaphatják: "Súlyos hiba történt az aktuális parancsban. Az eredményeket, ha vannak, el kell vetni" (hozzáadva a SQL Server 2019 CU16-ban).

  • Hozzáférés-megsértés akkor fordul elő, ha az ideiglenes táblákat szinonimák használatával hívja meg a rendszer az UDF-ben (a Microsoft SQL Server 2022 CU1 és SQL Server 2019 CU19 verzióban).

  • Hozzáférés-megsértés akkor következik be, ha az UDF-definíció csak GOTO címkéket és egyRETURN utasítást tartalmaz (SQL Server 2022 CU1 és SQL Server 2019 CU19).

  • A skaláris UDF különböző dátum- és időformátumokat ad vissza, ha a Skaláris UDF-formázási funkció be van kapcsolva (SQL Server 2022 CU3 és SQL Server 2019 CU20).

  • Memóriaképfájl akkor jön létre, ha egy GROUP BY záradékkal rendelkező lekérdezés beágyazott UDF-eket használ egy SELECT utasításban összesítő függvény nélkül (hozzáadva a 2022 CU12 és SQL Server 2019 CU26 SQL Server).

  • A "Maximális tárolt eljárás, függvény, eseményindító vagy nézet beágyazási szintje túllépve (32-es korlát)" hiba akkor fordul elő, ha a Skaláris UDF-formázási funkció be van kapcsolva, még akkor is, ha a beágyazási szint nincs túllépve (SQL Server 2022 CU12-ben és SQL Server 2019 CU26-ban).

  • Memóriasérülés akkor fordul elő sqllang.dll!CProchdr::FDeriveInlineabilityOfScalarUdf , ha a Skaláris UDF-formázási funkció be van kapcsolva (SQL Server 2022 CU12-ben és SQL Server 2019 CU26-ban).

  • Helytelen eredmények fordulnak elő az ugyanabban a lekérdezésben található Skaláris UDF-formázás és OPTION (RECOMPILE) kombinációja miatt (hozzáadva a 2022 CU17 és SQL Server 2019 CU31 SQL Server).

Ez az összegző frissítés a következő forgatókönyvekbe történő beszűkítést is blokkolja:

  • Ha az UDF bizonyos belső függvényekre hivatkozik (például @@ROWCOUNT), amelyek megváltoztathatják az eredményeket, ha az UDF beágyazott (SQL Server 2019 CU2-ben van hozzáadva).

  • Ha az aggregátumfüggvények paraméterként vannak átadva egy skaláris UDF-nek (SQL Server 2019 CU2-ben lett hozzáadva).

  • Ha az UDF beépített nézetekre hivatkozik (például: OBJECT_ID) (SQL Server 2019 CU2-ben van hozzáadva).

  • Ha az UDF XML-metódusokat használ (a SQL Server 2019 CU4-ben van hozzáadva).

  • Ha az UDF tartalmaz egy SELECTutasítást, amely aORDER BYzáradékot használja, de nem TOP 1(SQL Server 2019 CU4-ben van hozzáadva).

  • Ha aSELECT utasítás a ORDER BY záradékkal (például SELECT @x = @x +1 FROM table ORDER BY column_name) együtt végez hozzárendelést (a 2019 CU4 SQL Server tartalmazza).

  • Ha az UDF több RETURN utasítást tartalmaz (SQL Server 2019 CU5-ben van hozzáadva).

  • Ha az UDF egy RETURN utasításból van meghívva (SQL Server 2019 CU5-ben van hozzáadva).

  • Ha az UDF a STRING_AGG függvényre hivatkozik (a SQL Server 2019 CU5-ben van hozzáadva).

  • Ha az UDF-definíció távoli táblákra hivatkozik (SQL Server 2019 CU6-ban van hozzáadva).

  • Ha az UDF-hívó lekérdezés GROUPING SETS, CUBEvagy ROLLUP használ (SQL Server 2019 CU6-ban van hozzáadva).

  • Ha az UDF-hívó lekérdezés tartalmaz egy változót, amelyet A hozzárendelés UDF-paramétereként használnak (például SELECT @y=2, @x=UDF(@y)) (a 2019 CU6 SQL Server-ben van hozzáadva).

  • Ha az UDF titkosított oszlopokra hivatkozik (SQL Server 2019 CU11-ben van hozzáadva).

  • Ha az UDF WITH XMLNAMESPACEShivatkozik (SQL Server 2019 CU11-ben van hozzáadva).

  • Ha az UDF-et meghívó lekérdezés common table expressions (CTE) (a SQL Server 2019 CU11-ben lett hozzáadva).

  • Ha az UDF-definíció ideiglenes táblákat vagy szinonimákat tartalmaz az ideiglenes táblákhoz (SQL Server 2022 CU1 és SQL Server 2019 CU19).

  • Ha az UDF-definíció egySELECTutasítással és egyDISTINCTzáradékkal rendelkezik több hozzárendelési oszlopon (SQL Server 2022 CU4-ben és SQL Server 2019 CU20-ban).

  • Ha az UDF tartalmaz egy SELECT utasítást, amely a TABLESAMPLE PERCENT záradékot és több változó-hozzárendelést (a 2022 CU7 SQL Server tartalmazza).

  • Ha INSERT lekérdezés található egy UDF-et tartalmazó indexelt nézet által hivatkozott táblán (hozzáadva a 2022 CU12 és SQL Server 2019 CU26 SQL Server).

Miután SQL Server 2019 CU2-re frissített, de mielőtt SQL Server 2019 CU5-re frissít, újra meg kell vizsgálnia, hogy az UDF jogosult-e a formázásra. Ehhez frissítse a jogosult skaláris UDF-eket az alábbi módszerek valamelyikével:

  • Futtassa sp_refreshsqlmodule a megfelelő skaláris UDF-ekhez. A rendszer által tárolt eljárással kapcsolatos további információkért lásd: sp_refreshsqlmodule (Transact-SQL).

  • Módosítsa vagy hozza létre újra a meglévő skaláris UDF-et meglévő definíciók, engedélyek és tulajdonságok használatával. További információ: ALTER FUNCTION (Transact-SQL).

A következő parancs létrehoz egy szkriptet a meglévő beágyazott skaláris UDF-ek metaadatainak frissítéséhez:

/*

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

Megjegyzés: Miután SQL Server 2019 CU5-re frissített, a fordítás során automatikusan folytatjuk az UDF beágyazottságának származtatását.

Megoldás

Ezt a problémát a következő összegző frissítések javítják ki a SQL Server esetében:

A SQL Server minden új összegző frissítése tartalmazza az összes gyorsjavítást és az előző összegző frissítésben szereplő összes biztonsági javítást. Tekintse meg az SQL Server legújabb összegző frissítéseit:

Állapot

A Microsoft megerősítette, hogy ez a probléma a "Hatókör" szakaszban felsorolt Microsoft-termékekben található.

Hivatkozások

Ismerje meg a Microsoft által a szoftverfrissítések leírására használt terminológiát .

További segítségre van szüksége?

További lehetőségeket szeretne?

Fedezze fel az előfizetés előnyeit, böngésszen az oktatóanyagok között, ismerje meg, hogyan teheti biztonságossá eszközét, és így tovább.