KB4538581 - CORRECCIÓN: Problemas de inlineación de UDF escalar en SQL Server 2019

Síntomas

User-Defined funciones (UDF) que se implementan en Transact-SQL y que devuelven un único valor de datos se conocen como Funciones escalares (UDF) SQL T-User-Defined (UDF). 

Microsoft SQL Server 2019 introdujo la característica Delineación de UDF escalar que puede mejorar el rendimiento de las consultas que invocan UDF escalares de T-SQL, en las que la ejecución de UDF es el cuello de botella principal. La SQL UDF escalar transforma automáticamente las UDF inlineables en expresiones relacionales. 


Esta actualización acumulativa incluye varias correcciones en las siguientes áreas para escenarios en los que una consulta que usa la definición de UDF escalar puede devolver un error o resultados inesperados:

  • Error de no coincidencia de tipo si el tipo de retorno de la UDF es un error sql_variant (agregado en Microsoft SQL Server CU2 de 2019)

  • La invocación de UDF sp_executesql anula la ejecución (agregada en Microsoft SQL Server CU2 de 2019)

  • Las UDF que hacen referencia a etiquetas sin un comando GOTO asociado devuelven resultados incorrectos (agregados en Microsoft SQL Server CU2 de 2019)

  • Las condiciones de falta de memoria y las pérdidas de memoria se producen debido a udf escalares muy grandes (agregados en Microsoft SQL Server CU2 de 2019)

  • Las variables no inicializadas usadas en instrucciones de condición (SI-ELSE) provocan errores (agregados en Microsoft SQL Server CU2 de 2019)

  • Error de conversión explícita si UDF SQL_VARIANT (agregado en Microsoft SQL Server CU7 de 2019)

  • Error elevado cuando la función escalar hace referencia a SUMA.SUMA (agregada en Microsoft SQL Server CU7 de 2019)

  • La invocación de UDF con un gran número de expresiones escalares, las reevaluaciones pueden dar como resultado un error de programador que no produce rendimiento (agregado en Microsoft SQL Server CU7 de 2019)

  • Error elevado cuando la consulta de referencia UDF usa OPCIÓN (RECOMPIL) (agregada en Microsoft SQL Server CU7 de 2019)

  • Errores de permisos que se producen cuando las vistas invocan UDF inlined (agregados en Microsoft SQL Server CU9 de 2019)

  • Infracciones de Acceso que se producen al usar la query_tsql_scalar_udf_inlined XEvent (agregada en Microsoft SQL Server CU9 de 2019) 

  • Comportamiento incoherente debido a que la udf escalar no respeta la sugerencia de consulta "QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n" (agregada en Microsoft SQL Server CU9 de 2019)

  • Las UDF de inlineado contienen agregaciones que podrían dar como resultado un error de programador sin rendimiento (agregado en Microsoft SQL Server CU9 de 2019) 

  • Errores de memoria debido a una secuencia de operaciones escalares en la misma variable en bloques condicionales (agregada en Microsoft SQL Server CU9 de 2019)

  • Puede producirse una infracción de Access cuando un objeto invoca una UDF escalar inlineable (UDF1) con una UDF escalar inlineable (UDF2) que se usa como parámetro de entrada después de actualizar a CU9 (agregada en Microsoft SQL Server 2019 CU11)

  • La inlineación de UDF podría dar como resultado un error con los siguientes códigos de error 6846, 1011 y 107 (agregados en Microsoft SQL Server 2019 CU11)


Esta actualización acumulativa también bloquea la inlineación en los siguientes escenarios:

  • Si la UDF hace referencia a determinadas funciones intrínsecas (por ejemplo, @@ROWCOUNT) que pueden alterar los resultados cuando están en la lista (agregadas en Microsoft SQL Server 2019 CU2)

  • Cuando las funciones de agregado se pasan como parámetros a una UDF escalar (agregada en Microsoft SQL Server CU2 de 2019)

  • Si la UDF hace referencia a vistas integradas (por ejemplo: OBJECT_ID) (agregada en Microsoft SQL Server CU2 de 2019)

  • Si la UDF usa métodos XML (agregados en Microsoft SQL Server CU4 de 2019)

  • Si la UDF contiene un SELECT con ORDER BY sin un "TOP 1" (agregado en Microsoft SQL Server CU4 de 2019)

  • Si la consulta SELECT realiza una asignación junto con la cláusula ORDER BY (por ejemplo, SELECT @x = @x +1 FROM tabla ORDER BY column_name) (agregada en Microsoft SQL Server 2019 CU4)

  • Si la UDF contiene varias instrucciones RETURN (agregadas en Microsoft SQL Server CU5 de 2019)

  • Si se llama a la UDF desde una instrucción RETURN (agregada en Microsoft SQL Server CU5 de 2019)

  • Si la UDF hace referencia a STRING_AGG función (agregada en Microsoft SQL Server CU5 de 2019)

  • Si la definición de UDF hace referencia a tablas remotas (agregadas en Microsoft SQL Server CU6 de 2019)

  • Si la consulta de llamadas UDF usa CONJUNTOS DE AGRUPACIÓN, CUBO o PAQUETE ACUMULATIVO (agregado en Microsoft SQL Server CU6 de 2019)

  • Si la consulta de llamadas 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 Microsoft SQL Server 2019 CU6)

  • Si la UDF hace referencia a columnas cifradas (agregadas Microsoft SQL Server 2019 CU11)

  • Si la UDF contiene referencias a "WITH XMLNAMESPACES" (agregada en Microsoft SQL Server CU11 de 2019)

  • Si la consulta que invoca la UDF tiene expresiones de tabla comunes (CTEs) (agregadas en Microsoft SQL Server CU11 de 2019)


Después de actualizar a Microsoft SQL Server CU2 de 2019, pero antes de actualizar a CU5, debe volver a evaluar si una UDF es apta para incluir. Para ello, actualice las UDF escalares aptas a través de cualquiera de los siguientes métodos:

  • Ejecute sp_refreshsqlmodule para las UDF escalares aplicables (vea sp_refreshsqlmodule (Transact-SQL) para obtener más información sobre este procedimiento almacenado del sistema)

  • Modificar o volver a crear la UDF escalar existente mediante la definición, los permisos y las propiedades de conjunto existentes (vea FUNCIÓN ALTER (Transact-SQL))

El siguiente script genera un script para actualizar los metadatos de las UDF escalares inlineadas existentes:

/*

Genera un script que se puede usar para actualizar todas las UDF escalares inlineables activas.

Nota: El sp_refreshsqlmodule no afecta a ningún permiso, propiedades extendidas,

o las opciones SET asociadas al objeto.

*/

SELECCIONE 'EJECUTAR sys.sp_refreshsqlmodule ''[' + OBJECT_SCHEMA_NAME(object_id) + +'].' + '[' + OBJECT_NAME(object_id)

+ ']'';' AS 'RefreshStatement'

DESDE sys.sql_modules

WHERE is_inlineable = 1

Y inline_type = 1;

GO 

Nota Después de actualizar a Microsoft SQL Server CU5 2019, derivaremos automáticamente la inlineabilidad de UDF durante la compilación de nuevo.

Resolución

Este problema se ha corregido en la siguiente actualización acumulativa para 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 "Se aplica a".

Referencias

Obtenga información sobre la terminología que usa Microsoft para describir las actualizaciones de software.

¿Necesita más ayuda?

Ampliar sus conocimientos
Explorar los cursos
Obtener nuevas características primero
Unirse a Microsoft Insider

¿Le ha sido útil esta información?

¡Gracias por sus comentarios!

Gracias por sus comentarios. Quizá le interese ponerse en contacto con uno de nuestros agentes de soporte de Office.

×