Notre application doit fonctionner aussi bien avec une base de données Oracle ou une base de données Microsoft SQL Server. Pour faciliter cela, nous avons créé une poignée d'UDF pour homogénéiser notre syntaxe de requête. Par exemple, SQL Server a GETDATE () et Oracle a SYSDATE. Ils remplissent la même fonction mais ce sont des mots différents. Nous avons écrit un UDF wrapper appelé NOW () pour les deux plates-formes qui encapsule la syntaxe spécifique à la plate-forme appropriée dans un nom de fonction commun. Nous avons d'autres fonctions de ce type, dont certaines n'ont pratiquement rien d'autre mais n'existent que dans un but d'homogénéisation. Malheureusement, cela a un coût pour SQL Server. Les FDU scalaires en ligne font des ravages sur les performances et désactivent complètement le parallélisme. Comme alternative, nous avons écrit des fonctions d'assemblage CLR pour atteindre les mêmes objectifs. Lorsque nous avons déployé cela sur un client, il a commencé à rencontrer des blocages fréquents. Ce client particulier utilise des techniques de réplication et de haute disponibilité et je me demande s'il y a une sorte d'interaction en cours ici. Je ne comprends tout simplement pas comment l'introduction d'une fonction CLR pourrait causer des problèmes comme celui-ci. Pour référence, j'ai inclus la définition UDF scalaire d'origine ainsi que la définition CLR de remplacement en C # et la déclaration SQL correspondante. J'ai également un XML de blocage que je peux fournir si cela aide.
UDF d'origine
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
Fonction d'assemblage CLR
[SqlFunction(IsDeterministic = true)]
public static string APAD(string value, string tableName, string columnName)
{
return value?.Trim();
}
Déclaration SQL Server pour la fonction CLR
CREATE FUNCTION [fn].[APAD]
(
@Value NVARCHAR(4000),
@TableName NVARCHAR(4000),
@ColumnName NVARCHAR(4000)
) RETURNS NVARCHAR(4000)
AS
EXTERNAL NAME ASI.fn.APAD
GO