Síntomas
User-Defined funciones (UDF) que se implementan en Transact-SQLTransact-SQL y que devuelven un único valor de datos se conocen como funciones User-Defined escalares de T-SQL (UDF).
La característica de inlining Scalar UDF se introdujo en Microsoft SQL Server 2019. Esta característica puede mejorar el rendimiento de las consultas que invocan UDF escalares de T-SQL en los que la ejecución udf es el principal cuello de botella. La alineación UDF escalar de T-SQL transforma automáticamente los UDF alineables en expresiones relacionales.
Esta actualización acumulativa (CU) incluye varias correcciones en las siguientes áreas para escenarios en los que una consulta que usa la línea udf escalar puede devolver un mensaje de error o resultados inesperados:
- Se produce un error de coincidencia de tipo si el tipo devuelto de la UDF es un
sql_variant(agregado en SQL Server 2019 CU2). - La invocación UDF de
sp_executesqlcancela la ejecución (agregada en SQL Server 2019 CU2). - Los UDF que hacen referencia a etiquetas sin un comando asociado
GOTOdevuelven resultados incorrectos (agregados en SQL Server 2019 CU2). - Las condiciones de memoria insuficiente y pérdidas de memoria se producen debido a udFs escalares muy grandes (agregados en SQL Server 2019 CU2).
- Las variables no inicializadas que se usan en instrucciones de condición (
IF-ELSE) provocan errores (se agregan en SQL Server 2019 CU2). - El error de conversión explícita se produce si un UDF tiene el
sql_variantparámetro (agregado en SQL Server 2019 CU7). - Se produce un error si las referencias
CHECKSUMde función escalar (agregadas en SQL Server 2019 CU7). - La invocación UDF que tiene muchas evaluaciones escalares de expresiones puede provocar un error del programador que no produce rendimiento (agregado en SQL Server 2019 CU7).
Nota: La corrección de este problema puede causar a veces una regresión de rendimiento. Para mitigar esta regresión de rendimiento, puede deshabilitar la corrección original activando la marca de seguimiento (TF) 13156.
Microsoft está trabajando en una corrección para esta regresión de rendimiento que estará disponible en una futura CU. - Se produce un error si la UDF hace referencia a los usos
OPTION (RECOMPILE)de la consulta (agregado en SQL Server 2019 CU7). - Los errores de permisos se producen si las vistas invocan UDF en línea (agregados en SQL Server 2019 CU9).
- Las infracciones de acceso se producen si se usa XEvent
query_tsql_scalar_udf_inlined(agregado en SQL Server 2019 CU9). - Se produce un comportamiento incoherente porque la inlining scalar UDF no respeta la
QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_nsugerencia de consulta (agregada en SQL Server 2019 CU9). - Los UDF de inlining contienen agregaciones que pueden provocar errores del programador que no producen rendimiento (agregados en SQL Server 2019 CU9).
- Los errores de memoria insuficiente se producen debido a una secuencia de operaciones escalares en la misma variable en bloques condicionales (agregados en SQL Server 2019 CU9).
- Después de actualizar a CU9, se produce una infracción de acceso si un objeto invoca un UDF escalar inlineable (UDF1) que tiene un ESCALAR UDF inlineable (UDF2) que se usa como parámetro de entrada (agregado en SQL Server 2019 CU11).
- La inlining UDFs puede causar errores y generar códigos de error 6846, 1011 y 107 (agregado en SQL Server 2019 CU11).
- Si se escriben archivos UDF que se ejecutan como la cuenta que no es de sysadmin, se puede devolver el mensaje de error "Se ha producido un error grave en el comando actual. Los resultados, si los hay, deben descartarse" (agregado en SQL Server 2019 CU16).
- Se produce una infracción de acceso si se invocan tablas temporales dentro de archivos UDF mediante sinónimos (agregados en Microsoft SQL Server 2022 CU1 y SQL Server 2019 CU19).
- Se produce una infracción de acceso si la definición udf contiene solo
GOTOetiquetas y unaRETURNinstrucción (agregada en SQL Server 2022 CU1 y SQL Server 2019 CU19). - La FUNCIÓN UDF escalar devuelve los resultados en diferentes formatos de fecha y hora cuando la característica de inlining scalar UDF está activada (agregada a SQL Server 2022 CU3 y SQL Server 2019 CU20).
- Se genera un archivo de volcado si una consulta que tiene una
GROUP BYcláusula usa UDF en una instrucción sin unaSELECTfunción de agregado (agregado en SQL Server 2022 CU12 y SQL Server 2019 CU26). - Error "Se ha superado el nivel de anidamiento máximo de procedimiento almacenado, función, desencadenador o vista (límite 32)" si la característica Deslinde UDF escalar está activada, incluso si no se supera el nivel de anidamiento (agregado en SQL Server 2022 CU12 y SQL Server 2019 CU26).
- Los daños en
sqllang.dll!CProchdr::FDeriveInlineabilityOfScalarUdfla memoria se producen si se activa la característica de inlining scalar UDF (agregada a SQL Server 2022 CU12 y SQL Server 2019 CU26). - Los resultados incorrectos se producen debido a la combinación de línea de UDF escalar y
OPTION (RECOMPILE)en la misma consulta (agregada en SQL Server 2022 CU17 y SQL Server 2019 CU31).
Esta actualización acumulativa también bloquea la línea en los siguientes escenarios:
- Si la UDF hace referencia a determinadas funciones intrínsecas (por ejemplo,
@@ROWCOUNT) que podrían alterar los resultados si la UDF está en línea (agregada en SQL Server 2019 CU2). - Si las funciones de agregado se pasan como parámetros a un UDF escalar (agregado en SQL Server 2019 CU2).
- Si la UDF hace referencia a vistas integradas (por ejemplo:
OBJECT_ID) (agregadas en SQL Server 2019 CU2). - Si el UDF usa métodos XML (agregados en SQL Server 2019 CU4).
- Si la UDF contiene una
SELECTinstrucción que usa laORDER BYcláusula pero noTOP 1(agregada en SQL Server 2019 CU4). - Si la
SELECTinstrucción realiza una asignación junto con laORDER BYcláusula (por ejemplo,SELECT @x = @x +1 FROM table ORDER BY column_name) (agregada en SQL Server 2019 CU4). - Si la UDF contiene varias
RETURNinstrucciones (agregadas en SQL Server 2019 CU5). - Si se llama al UDF desde una
RETURNinstrucción (agregada en SQL Server 2019 CU5). - Si la UDF hace referencia a la
STRING_AGGfunción (agregada en SQL Server 2019 CU5). - Si la definición de UDF hace referencia a tablas remotas (agregadas en SQL Server 2019 CU6).
- Si la consulta de llamada UDF usa
GROUPING SETS,CUBEoROLLUP(agregada en SQL Server 2019 CU6). - Si la consulta de llamada UDF contiene una variable que se usa como parámetro UDF para la asignación (por ejemplo,
SELECT @y=2, @x=UDF(@y)) (agregada en SQL Server 2019 CU6). - Si la UDF hace referencia a columnas cifradas (agregadas en SQL Server 2019 CU11).
- Si el UDF contiene referencias a
WITH XMLNAMESPACES(agregadas en SQL Server 2019 CU11). - Si la consulta que invoca el UDF tiene expresiones de tabla comunes (CTEs) (agregadas en SQL Server 2019 CU11).
- Si la definición de UDF contiene tablas temporales o sinónimos de tablas temporales (agregadas en SQL Server 2022 CU1 y SQL Server 2019 CU19).
- Si la definición de UDF tiene una
SELECTinstrucción junto con unaDISTINCTcláusula en varias columnas de asignación (agregada en SQL Server 2022 CU4 y SQL Server 2019 CU20). - Si la UDF contiene una
SELECTinstrucción que usa laTABLESAMPLE PERCENTcláusula y varias asignaciones de variables (agregadas en SQL Server 2022 CU7). - Si existe una
INSERTconsulta en una tabla a la que se hace referencia en una vista indexada que contiene una UDF (agregada a SQL Server 2022 CU12 y SQL Server 2019 CU26).
Después de actualizar a SQL Server 2019 CU2, pero antes de actualizar a SQL Server 2019 CU5, debe volver a evaluar si una UDF es apta para la inlining. Para ello, actualice los UDF escalares válidos mediante cualquiera de los siguientes métodos:
- Ejecute
sp_refreshsqlmodulepara los UDF escalares aplicables. Para obtener más información sobre este procedimiento almacenado del sistema, vea sp_refreshsqlmodule (Transact-SQL). - Altere o vuelva a crear el UDF escalar existente mediante definiciones, permisos y propiedades de conjunto existentes. Para obtener más información, vea ALTER FUNCTION (Transact-SQL).
El siguiente comando genera un script para actualizar los metadatos de cualquier UDF escalar alineado existente:
/*
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
Nota: Después de actualizar a SQL Server 2019 CU5, reanudaremos automáticamente la alineación UDF durante la compilación.
Resolución
Este problema se ha corregido en las siguientes actualizaciones acumulativas para SQL Server:
Acerca de las actualizaciones acumulativas de SQL Server
Cada nueva actualización acumulativa de SQL Server contiene todas las revisiones y todas las correcciones de seguridad que se incluyeron con la actualización acumulativa anterior. Consulte las actualizaciones acumulativas más recientes para SQL Server:
- Actualización acumulativa más reciente para SQL Server 2022
- Actualización acumulativa más reciente para SQL Server 2019
Estado
Microsoft ha confirmado que se trata de un problema de los productos de Microsoft enumerados en la sección "La información de este artículo se refiere a".
Referencias
Obtenga información sobre la terminología que usa Microsoft para describir las actualizaciones de software.