Aplikasi kita perlu bekerja sama baiknya dengan database Oracle atau database Microsoft SQL Server. Untuk memfasilitasi ini, kami membuat beberapa UDF untuk menyeragamkan sintaksis kueri kami. Sebagai contoh, SQL Server memiliki GETDATE () dan Oracle memiliki SYSDATE. Mereka melakukan fungsi yang sama tetapi kata-kata mereka berbeda. Kami menulis pembungkus UDF yang disebut SEKARANG () untuk kedua platform yang membungkus sintaksis platform spesifik yang relevan dengan nama fungsi umum. Kami memiliki fungsi lain seperti itu, beberapa di antaranya pada dasarnya tidak ada tetapi hanya ada demi homogenisasi. Sayangnya, ini memiliki biaya untuk SQL Server. UDF skalar sebaris mendatangkan malapetaka pada kinerja dan sepenuhnya menonaktifkan paralelisme. Sebagai alternatif, kami menulis fungsi perakitan CLR untuk mencapai tujuan yang sama. Ketika kami menyebarkan ini ke klien, mereka mulai sering mengalami kebuntuan. Klien khusus ini menggunakan replikasi dan teknik ketersediaan tinggi dan saya bertanya-tanya apakah ada semacam interaksi yang terjadi di sini. Saya hanya tidak mengerti bagaimana memperkenalkan fungsi CLR akan menyebabkan masalah seperti ini. Sebagai referensi, saya telah memasukkan definisi skalar UDF asli serta definisi CLR pengganti di C # dan deklarasi SQL untuk itu. Saya juga memiliki kebuntuan XML yang bisa saya berikan jika itu membantu.
UDF asli
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
Fungsi Perakitan CLR
[SqlFunction(IsDeterministic = true)]
public static string APAD(string value, string tableName, string columnName)
{
return value?.Trim();
}
Deklarasi SQL Server untuk Fungsi CLR
CREATE FUNCTION [fn].[APAD]
(
@Value NVARCHAR(4000),
@TableName NVARCHAR(4000),
@ColumnName NVARCHAR(4000)
) RETURNS NVARCHAR(4000)
AS
EXTERNAL NAME ASI.fn.APAD
GO