Tôi có CLR nhỏ này thực hiện chức năng RegEX trên một chuỗi trong các cột.
Khi chạy trên SQL Server 2014 (12.0.2000) trên Windows Server 2012R2, quá trình gặp sự cố với
Msg 0, Cấp 11, Trạng thái 0, Dòng 0 Đã xảy ra lỗi nghiêm trọng trên lệnh hiện tại. Các kết quả, nếu có, cần được loại bỏ.
và đưa ra một bãi chứa ngăn xếp nếu tôi làm
select count (*) from table where (CLRREGEX,'Regex')
nhưng khi tôi làm
select * from table where (CLRREGEX,'Regex')
nó trả về các hàng
Hoạt động hoàn hảo trên cùng một bản dựng SQL Server chạy trên Windows 8.1.
Có ý kiến gì không?
- Chỉnh sửa Nó đơn giản như nó có thể được
using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlTypes; //SqlString, SqlInt32, SqlBoolean
using System.Text.RegularExpressions; //Match, Regex
using Microsoft.SqlServer.Server; //SqlFunctionAttribute
public partial class UserDefinedFunctions
{
public static readonly RegexOptions Options = RegexOptions.IgnorePatternWhitespace | RegexOptions.Multiline;
[SqlFunction]
[Microsoft.SqlServer.Server.SqlFunction(IsDeterministic = true, IsPrecise = true)]
public static SqlBoolean RegExMatch(SqlString input, SqlString pattern)
{
if (input.IsNull || pattern.IsNull) //nulls dont qualify for a match
return SqlBoolean.False;
return Regex.IsMatch(input.Value, pattern.Value, RegexOptions.IgnoreCase);
}
}
Vì vậy, bằng những thay đổi nhỏ, công việc này hiện đang hoạt động: Bài học chính về C # dường như giống như trong TSQL hãy cẩn thận với việc chuyển đổi dữ liệu ngầm.
using System;
using System.Text;
using System.Data.SqlTypes; //SqlString, SqlInt32, SqlBoolean
using System.Text.RegularExpressions; //Match, Regex
using Microsoft.SqlServer.Server; //SqlFunctionAttribute
public partial class UserDefinedFunctions
{
public static readonly RegexOptions Options = RegexOptions.IgnorePatternWhitespace | RegexOptions.Singleline | RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.CultureInvariant;
[Microsoft.SqlServer.Server.SqlFunction(IsDeterministic = true, IsPrecise = true, DataAccess = DataAccessKind.Read)]
public static SqlBoolean RegExMatch(SqlString input, SqlString pattern)
{
if (input.IsNull || pattern.IsNull) //nulls dont qualify for a match
return SqlBoolean.False;
string sqldata = input.ToString();
string regex = pattern.ToString();
return Regex.IsMatch(sqldata, regex);
}
[SqlFunction]
thuộc tính trùng lặp . Đó có phải là mã chính xác? Tôi không nghĩ rằng nó sẽ được biên dịch. Phân biệt phiên bản Framework 2.0 / 3.0 / 3.5 không phải là vấn đề vì bạn đang sử dụng 4.0 / 4.5 / 4.5.x / etc hoặc bất cứ thứ gì trên máy chủ đó vì bạn đang ở trên SQL Server 2014 bị ràng buộc với phiên bản CLR 4. Đây có phải là Máy chủ hiển thị vấn đề 32-bit? Nó có bao nhiêu bộ nhớ so với các máy chủ khác? Và bạn đã kiểm tra nhật ký SQL Server ngay sau khi gặp lỗi đó chưa?
MatchTimeout
. Nhưng tôi không nghĩ đó thực sự là vấn đề nếu bạn chỉ đạt tối đa 5 ký tự. Đó là có thể là một máy tính này có hỏng cài đặt của .NET Framework, và có thể được sửa chữa một lần cá hồi hoạt động khai thác đã ngừng ;-). Ngoài ra, [0-9].*
đơn giản nhưng cũng không hiệu quả vì nó phù hợp với tất cả các ký tự, nếu có, sau chữ số đầu tiên; sử dụng chỉ [0-9]
cho một IsMatch
là tốt hơn.
DataAccessKind
thành Read
? Điều đó chỉ làm chậm nó và bạn không thực hiện bất kỳ truy cập dữ liệu. Ngoài ra, tôi nhận ra rằng nó dường như đang hoạt động, nhưng tôi sẽ thận trọng với việc sử dụng ToString()
phương pháp trái ngược với Value
tài sản vì tôi không nghĩ ToString xử lý mã hóa đúng cách, hoặc đại loại như thế. Đối chiếu cơ sở dữ liệu của bạn được đặt là gì? Tất nhiên, tôi chỉ đọc lại một trong những bình luận của bạn ở trên và thấy rằng cột là VARCHAR thay vì NVARCHAR. Liệu lĩnh vực đó có một đối chiếu khác với cơ sở dữ liệu?
SqlFunction
phương pháp được đánh dấu làIsDeterministic=true
? Là lắp ráp được đánh dấu làSAFE
?