Nuestra aplicación debe funcionar igualmente bien con una base de datos Oracle o una base de datos Microsoft SQL Server. Para facilitar esto, creamos un puñado de UDF para homogeneizar nuestra sintaxis de consulta. Por ejemplo, SQL Server tiene GETDATE () y Oracle tiene SYSDATE. Realizan la misma función pero son palabras diferentes. Escribimos un UDF contenedor llamado NOW () para ambas plataformas que envuelve la sintaxis específica de la plataforma relevante en un nombre de función común. Tenemos otras funciones similares, algunas de las cuales esencialmente no hacen más que existir únicamente por el bien de la homogeneización. Desafortunadamente, esto tiene un costo para SQL Server. Las UDF escalares en línea causan estragos en el rendimiento y deshabilitan completamente el paralelismo. Como alternativa, escribimos funciones de ensamblaje CLR para lograr los mismos objetivos. Cuando implementamos esto en un cliente, comenzaron a experimentar puntos muertos frecuentes. Este cliente en particular está utilizando técnicas de replicación y alta disponibilidad y me pregunto si hay algún tipo de interacción aquí. Simplemente no entiendo cómo la introducción de una función CLR podría causar problemas como este. Como referencia, he incluido la definición original de UDF escalar, así como la definición de reemplazo de CLR en C # y la declaración de SQL correspondiente. También tengo un XML de punto muerto que puedo proporcionar si eso ayuda.
UDF original
CREATE FUNCTION [fn].[APAD]
(
@Value VARCHAR(4000)
, @tablename VARCHAR(4000) = NULL
, @columnname VARCHAR(4000) = NULL
)
RETURNS VARCHAR(4000)
WITH SCHEMABINDING
AS
BEGIN
RETURN LTRIM(RTRIM(@Value))
END
GO
Función de ensamblaje de CLR
[SqlFunction(IsDeterministic = true)]
public static string APAD(string value, string tableName, string columnName)
{
return value?.Trim();
}
Declaración de SQL Server para la función CLR
CREATE FUNCTION [fn].[APAD]
(
@Value NVARCHAR(4000),
@TableName NVARCHAR(4000),
@ColumnName NVARCHAR(4000)
) RETURNS NVARCHAR(4000)
AS
EXTERNAL NAME ASI.fn.APAD
GO