KB4538581 - CORRECCIÓN: Problemas de inlining escalares UDF en SQL Server 2022 y 2019

Se aplica a
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)

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_executesql cancela la ejecución (agregada en SQL Server 2019 CU2).
  • Los UDF que hacen referencia a etiquetas sin un comando asociado GOTO devuelven 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_variant parámetro (agregado en SQL Server 2019 CU7).
  • Se produce un error si las referencias CHECKSUM de 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_n sugerencia 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 GOTO etiquetas y una RETURN instrucció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 BY cláusula usa UDF en una instrucción sin una SELECT funció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::FDeriveInlineabilityOfScalarUdf la 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 SELECT instrucción que usa la ORDER BY cláusula pero no TOP 1 (agregada en SQL Server 2019 CU4).
  • Si la SELECT instrucción realiza una asignación junto con la ORDER BY cláusula (por ejemplo, SELECT @x = @x +1 FROM table ORDER BY column_name) (agregada en SQL Server 2019 CU4).
  • Si la UDF contiene varias RETURN instrucciones (agregadas en SQL Server 2019 CU5).
  • Si se llama al UDF desde una RETURN instrucción (agregada en SQL Server 2019 CU5).
  • Si la UDF hace referencia a la STRING_AGG funció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, CUBEo ROLLUP (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 SELECT instrucción junto con una DISTINCT cláusula en varias columnas de asignación (agregada en SQL Server 2022 CU4 y SQL Server 2019 CU20).
  • Si la UDF contiene una SELECT instrucción que usa la TABLESAMPLE PERCENT cláusula y varias asignaciones de variables (agregadas en SQL Server 2022 CU7).
  • Si existe una INSERT consulta 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_refreshsqlmodule para 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:

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.