แอปพลิเคชันของเราต้องทำงานอย่างเท่าเทียมกันกับฐานข้อมูล Oracle หรือฐานข้อมูล Microsoft SQL Server เพื่ออำนวยความสะดวกในเรื่องนี้เราได้สร้าง UDF จำนวนหนึ่งเพื่อทำให้ไวยากรณ์การสืบค้นของเราเป็นเนื้อเดียวกัน ตัวอย่างเช่น SQL Server มี GETDATE () และ Oracle มี SYSDATE พวกเขาทำหน้าที่เดียวกัน แต่เป็นคำที่ต่างกัน เราเขียน wrapper UDF ชื่อ NOW () สำหรับทั้งสองแพลตฟอร์มซึ่งล้อมรอบไวยากรณ์เฉพาะแพลตฟอร์มที่เกี่ยวข้องในชื่อฟังก์ชันทั่วไป เรามีฟังก์ชั่นอื่น ๆ ซึ่งบางส่วนไม่ทำอะไรเลย แต่มีอยู่เพียงเพื่อความเป็นเนื้อเดียวกัน น่าเสียดายที่ค่าใช้จ่ายนี้สำหรับ SQL Server UDF สเกลาร์แบบอินไลน์สร้างความหายนะต่อประสิทธิภาพและปิดการใช้งานความขนานอย่างสมบูรณ์ เป็นทางเลือกเราเขียนฟังก์ชันการประกอบ CLR เพื่อให้บรรลุเป้าหมายเดียวกัน เมื่อเราปรับใช้สิ่งนี้กับลูกค้าพวกเขาเริ่มประสบกับการหยุดชะงักบ่อยครั้ง ลูกค้ารายนี้ใช้การจำลองแบบและเทคนิคความพร้อมใช้งานสูงและฉันสงสัยว่ามีการโต้ตอบบางอย่างเกิดขึ้นที่นี่หรือไม่ ฉันไม่เข้าใจว่าการแนะนำฟังก์ชัน CLR จะทำให้เกิดปัญหาเช่นนี้ได้อย่างไร สำหรับการอ้างอิงฉันได้รวมข้อกำหนด UDF สเกลาร์ต้นฉบับไว้รวมถึงข้อกำหนดการแทนที่ CLR ใน C # และการประกาศ SQL สำหรับมัน ฉันยังมี deadlock XML ที่ฉันสามารถให้ได้หากมีสิ่งนั้นช่วย
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
[SqlFunction(IsDeterministic = true)]
public static string APAD(string value, string tableName, string columnName)
{
return value?.Trim();
}
การประกาศเซิร์ฟเวอร์ SQL สำหรับฟังก์ชัน CLR
CREATE FUNCTION [fn].[APAD]
(
@Value NVARCHAR(4000),
@TableName NVARCHAR(4000),
@ColumnName NVARCHAR(4000)
) RETURNS NVARCHAR(4000)
AS
EXTERNAL NAME ASI.fn.APAD
GO