हमारे एप्लिकेशन को Oracle डेटाबेस या Microsoft SQL सर्वर डेटाबेस के साथ समान रूप से अच्छी तरह से काम करने की आवश्यकता है। इसे सुविधाजनक बनाने के लिए, हमने अपने क्वेरी सिंटैक्स को समरूप बनाने के लिए मुट्ठी भर यूडीएफ बनाए। उदाहरण के लिए, SQL सर्वर में GETDATE () और Oracle में SYSDATE है। वे एक ही कार्य करते हैं लेकिन वे अलग-अलग शब्द हैं। हमने दोनों प्लेटफ़ॉर्म के लिए अब () नामक एक रैपर UDF लिखा, जो एक सामान्य फ़ंक्शन नाम में संबंधित प्लेटफ़ॉर्म विशिष्ट सिंटैक्स को लपेटता है। हमारे पास ऐसे अन्य कार्य हैं, जिनमें से कुछ अनिवार्य रूप से कुछ भी नहीं करते हैं, लेकिन पूरी तरह से समरूपीकरण के लिए मौजूद हैं। दुर्भाग्य से, यह SQL सर्वर के लिए एक लागत है। इनलाइन स्केलर यूडीएफ प्रदर्शन पर कहर बरपाता है और पूरी तरह से समानता को निष्क्रिय करता है। एक विकल्प के रूप में, हमने समान लक्ष्यों को पूरा करने के लिए सीएलआर असेंबली फ़ंक्शन लिखा। जब हमने इसे एक ग्राहक को तैनात किया तो उन्हें लगातार गतिरोध का अनुभव होने लगा। यह विशेष रूप से ग्राहक प्रतिकृति और उच्च उपलब्धता तकनीकों का उपयोग कर रहा है और मुझे आश्चर्य हो रहा है कि यहां कुछ प्रकार की बातचीत चल रही है। मुझे नहीं समझ में आया कि CLR फ़ंक्शन को शुरू करने से इस तरह की समस्याएं कैसे होंगी। संदर्भ के लिए, मैंने मूल स्केलर यूडीएफ परिभाषा के साथ-साथ सी # में प्रतिस्थापन सीएलआर परिभाषा और इसके लिए एसक्यूएल घोषणा को शामिल किया है। मेरे पास एक्सएमएल भी है जो मैं प्रदान कर सकता हूं यदि वह मदद करता है।
मूल यूडीएफ
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
सीएलआर विधानसभा समारोह
[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