Uygulamamızın bir Oracle veritabanı veya Microsoft SQL Server veritabanı ile eşit derecede iyi çalışması gerekir. Bunu kolaylaştırmak için, sorgu sözdizimimizi homojenleştirmek üzere bir avuç UDF oluşturduk. Örneğin, SQL Server'da GETDATE () ve Oracle'da SYSDATE vardır. Aynı işlevi yerine getirirler ancak farklı kelimelerdir. Her iki platform için de ortak bir işlev adına ilgili platforma özgü sözdizimini saran NOW () adında bir sarıcı yazdık. Bazıları sadece homojenizasyon uğruna var olmaktan başka hiçbir şey yapmayan başka işlevlerimiz var. Ne yazık ki, bunun SQL Server için bir maliyeti var. Satır içi skaler UDF'ler performansa zarar verir ve paralelliği tamamen devre dışı bırakır. Alternatif olarak, aynı hedeflere ulaşmak için CLR montaj fonksiyonlarını yazdık. Bunu bir istemciye konuşlandırdığımızda sık sık kilitlenmeler yaşamaya başladılar. Bu özel istemci çoğaltma ve yüksek kullanılabilirlik tekniklerini kullanıyor ve burada bir tür etkileşim olup olmadığını merak ediyorum. Ben sadece bir CLR işlevi tanıtmanın böyle sorunlara nasıl neden olacağını anlamıyorum. Referans olarak, orijinal skaler UDF tanımının yanı sıra C #'daki yedek CLR tanımını ve bunun için SQL bildirimini ekledim. Ayrıca yardımcı olursa sağlayabileceğim kilitlenme XML var.
Orijinal 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 Montaj İşlevi
[SqlFunction(IsDeterministic = true)]
public static string APAD(string value, string tableName, string columnName)
{
return value?.Trim();
}
CLR İşlevi için SQL Server Bildirimi
CREATE FUNCTION [fn].[APAD]
(
@Value NVARCHAR(4000),
@TableName NVARCHAR(4000),
@ColumnName NVARCHAR(4000)
) RETURNS NVARCHAR(4000)
AS
EXTERNAL NAME ASI.fn.APAD
GO