2013-01-19 39 views
6

Tôi đang cố gắng cải thiện chức năng Clr trong liên kết http://msdn.microsoft.com/en-us/magazine/cc163473.aspx.Tạo chức năng clr biểu thức chính quy nhanh hơn

public static partial class UserDefinedFunctions 
{ 
    public static readonly RegexOptions Options = 
     RegexOptions.IgnorePatternWhitespace | 
     RegexOptions.Singleline; 

    [SqlFunction] 
    public static SqlBoolean RegexMatch(
     SqlChars input, SqlString pattern) 
    { 
     Regex regex = new Regex(pattern.Value, Options); 
     return regex.IsMatch(new string(input.Value)); 
    } 
} 

Khi thực hiện select * from Table1 where dbo.RegexMatch(col1, 'pattern') = 1, hàm Clr tạo đối tượng Regex mới cho mỗi hàng trong bảng.

Có thể tạo chỉ một đối tượng Regex cho mỗi câu lệnh Sql không? Đối với mỗi hàng chỉ cần gọi regex.Ismatch(...). Mã sau có hợp lệ không?

public static partial class UserDefinedFunctions 
{ 
    public static readonly RegexOptions Options = 
     RegexOptions.IgnorePatternWhitespace | 
     RegexOptions.Singleline; 

    static Regex regex = null; 

    [SqlFunction] 
    public static SqlBoolean RegexMatch(
     SqlChars input, SqlString pattern) 
    { 
     if (regex == null) 
      regex = new Regex(pattern.Value, Options); 
     return regex.IsMatch(new string(input.Value)); 
    } 
} 
+0

Bài viết gợi ý rằng nếu bạn sử dụng 'RegexOptions.Compiled' thì nó có thể được lưu trong bộ nhớ cache - nhưng tôi không thể thấy bằng chứng nào khác về điều đó ... –

+0

Thú vị. Phương thức khởi tạo của Regex sẽ tái sử dụng cá thể Regex nếu nó có tùy chọn biên dịch và cùng mẫu? Tôi đã nghĩ đến một số mẫu Singleton nhưng không chắc chắn về cuộc đời của singleton. – ca9163d9

+0

Nó sẽ không tái sử dụng cùng một thực tế * dụ *, nhưng nó có thể tái sử dụng tất cả các công việc được thực hiện để tạo ra trường hợp trước đó. –

Trả lời

2

UDF của bạn dựa thể hiện của regex tĩnh của bạn có lẽ thậm chí không tái sử dụng, bạn tốt hơn về cách gọi phiên bản tĩnh của

System.Text.RegularExpressions.RegEx.IsMatch(string input, string pattern, RegexOptions options);

trực tiếp.

Xin lưu ý rằng ở chế độ gỡ lỗi, mọi thứ hoạt động khác với những gì họ làm trong quá trình sản xuất và SQL sẽ giải phóng bộ nhớ khi cần.

Ngoài ra, hãy thử sử dụng RegexOptions.CompiledCultureInvariant.

+0

Quá tải tĩnh sử dụng bộ đệm ẩn dưới mui xe, đó là lý do câu trả lời này là tốt. +1 – usr

+0

Thật kỳ lạ tại sao phương pháp chỉ đọc tĩnh có thể không được tái sử dụng? – ca9163d9

Các vấn đề liên quan