Ứng dụng của chúng tôi cần hoạt động tốt như nhau với cơ sở dữ liệu Oracle hoặc cơ sở dữ liệu Microsoft SQL Server. Để tạo điều kiện cho điều này, chúng tôi đã tạo ra một số UDF để đồng nhất hóa cú pháp truy vấn của chúng tôi. Ví dụ: SQL Server có GETDATE () và Oracle có SYSDATE. Chúng thực hiện cùng chức năng nhưng chúng là những từ khác nhau. Chúng tôi đã viết một UDF trình bao bọc có tên NOW () cho cả hai nền tảng bao gồm cú pháp cụ thể của nền tảng có liên quan trong một tên hàm phổ biến. Chúng tôi có các chức năng khác như vậy, một số trong đó về cơ bản không làm gì ngoài việc tồn tại chỉ vì mục đích đồng nhất hóa. Thật không may, điều này có chi phí cho SQL Server. Các UDF vô hướng nội tuyến tàn phá hiệu năng và vô hiệu hóa hoàn toàn song song. Thay vào đó, chúng tôi đã viết các hàm lắp ráp CLR để thực hiện các mục tiêu tương tự. Khi chúng tôi triển khai nó cho khách hàng, họ bắt đầu gặp bế tắc thường xuyên. Khách hàng cụ thể này đang sử dụng các kỹ thuật nhân rộng và tính sẵn sàng cao và tôi tự hỏi liệu có một số loại tương tác đang diễn ra ở đây không. Tôi chỉ không hiểu làm thế nào để giới thiệu một chức năng CLR sẽ gây ra vấn đề như thế này. Để tham khảo, tôi đã bao gồm định nghĩa UDF vô hướng ban đầu cũng như định nghĩa CLR thay thế trong C # và khai báo SQL cho nó. Tôi cũng có XML bế tắc mà tôi có thể cung cấp nếu điều đó có ích.
UDF gốc
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
Chức năng hội CLR
[SqlFunction(IsDeterministic = true)]
public static string APAD(string value, string tableName, string columnName)
{
return value?.Trim();
}
Khai báo SQL Server cho chức năng CLR
CREATE FUNCTION [fn].[APAD]
(
@Value NVARCHAR(4000),
@TableName NVARCHAR(4000),
@ColumnName NVARCHAR(4000)
) RETURNS NVARCHAR(4000)
AS
EXTERNAL NAME ASI.fn.APAD
GO