Unsere Anwendung muss mit einer Oracle-Datenbank oder einer Microsoft SQL Server-Datenbank gleich gut funktionieren. Um dies zu vereinfachen, haben wir eine Handvoll UDFs erstellt, um unsere Abfragesyntax zu homogenisieren. Beispielsweise hat SQL Server GETDATE () und Oracle SYSDATE. Sie erfüllen dieselbe Funktion, sind jedoch unterschiedliche Wörter. Wir haben für beide Plattformen eine Wrapper-UDF namens NOW () geschrieben, die die relevante plattformspezifische Syntax in einen gemeinsamen Funktionsnamen einschließt. Wir haben andere solche Funktionen, von denen einige im Wesentlichen nichts anderes tun, als nur zur Homogenisierung zu existieren. Leider hat dies Kosten für SQL Server. Inline-skalare UDFs beeinträchtigen die Leistung und deaktivieren die Parallelität vollständig. Als Alternative haben wir CLR-Assembly-Funktionen geschrieben, um dieselben Ziele zu erreichen. Als wir dies für einen Client bereitstellten, traten häufig Deadlocks auf. Dieser spezielle Client verwendet Replikations- und Hochverfügbarkeitstechniken und ich frage mich, ob hier irgendeine Art von Interaktion stattfindet. Ich verstehe nur nicht, wie die Einführung einer CLR-Funktion solche Probleme verursachen würde. Als Referenz habe ich die ursprüngliche skalare UDF-Definition sowie die Ersatz-CLR-Definition in C # und die SQL-Deklaration dafür aufgenommen. Ich habe auch Deadlock-XML, das ich bereitstellen kann, wenn das hilft.
Original UDF
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
CLR-Montagefunktion
[SqlFunction(IsDeterministic = true)]
public static string APAD(string value, string tableName, string columnName)
{
return value?.Trim();
}
SQL Server-Deklaration für die CLR-Funktion
CREATE FUNCTION [fn].[APAD]
(
@Value NVARCHAR(4000),
@TableName NVARCHAR(4000),
@ColumnName NVARCHAR(4000)
) RETURNS NVARCHAR(4000)
AS
EXTERNAL NAME ASI.fn.APAD
GO