Sütunlarda bir dize üzerinde RegEX işlevi yapan bu küçük CLR var.
Windows Server 2012R2'de SQL Server 2014 (12.0.2000) üzerinde çalışırken, işlem
Msg 0, Seviye 11, Durum 0, Satır 0 Geçerli komutta ciddi bir hata oluştu. Varsa sonuçlar atılmalıdır.
ve eğer yaparsam bir yığın dökümü verir
select count (*) from table where (CLRREGEX,'Regex')
ama yaptığımda
select * from table where (CLRREGEX,'Regex')
satırları döndürür.
Windows 8.1 üzerinde çalışan aynı SQL Server derlemesinde mükemmel çalışır.
Herhangi bir fikir?
- Düzenle Olabildiğince basit
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);
}
}
Yani küçük değişiklikler ile bu şimdi çalışıyor: C # ana ders örtülü veri dönüştürme sakının TSQL ile aynı gibi görünüyor.
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]
öznitelik dışında kod iyi görünüyor . Bu tam kod mu? Bunun derleneceğini sanmıyorum. 4.0 / 4.5 / 4.5.x / etc sürümünü ya da CLR sürüm 4'e bağlı SQL Server 2014'te bulunduğunuzdan bu sunucuda ne varsa Framework sürüm 2.0 / 3.0 / 3.5 ayrımı bir sorun oluşturmaz. sorun 32-bit gösteren sunucu? Diğer sunuculara kıyasla ne kadar bellek var? Ve bu hatayı aldıktan hemen sonra SQL Server günlüklerini kontrol ettiniz mi?
MatchTimeout
özelliği kullanabileceğiniz anlamına geleceği için tüm sunucuların en az 4.5'te olup olmadığını bilmek güzel olurdu . Ama sadece 5 karakter geçiyorsan ya gerçekten sorun olduğunu sanmıyorum. O ise bu bir makine .NET Framework yüklemek bozuk olması mümkün ve alabalık balıkçılık faaliyetleri ;-) durdurdu kez bu tamir edilebilir. Ayrıca, [0-9].*
ilk basamaktan sonra varsa tüm karakterlerle eşleştiği için basit ama aynı zamanda verimsizdir; sadece bir [0-9]
için kullanmak IsMatch
daha iyidir.
DataAccessKind
için Read
? Bu sadece yavaşlatır ve herhangi bir veri erişimi yapmazsınız. Ayrıca, şu anda çalışıyor gibi görüyorum, ama ToString kodlamaları düzgün bir şekilde işlediğini veya böyle bir şey düşünmüyorum gibi özellik ToString()
yerine aksine yöntemi kullanarak dikkatli Value
olurum. Veritabanları harmanlama ayarınız nedir? Tabii ki, yukarıdaki yorumlarınızdan birini tekrar okudum ve sütunun NVARCHAR yerine VARCHAR olduğunu görüyorum. Bu alanın veritabanından farklı bir harmanlaması var mı?
SqlFunction
yöntem olarak işaretlenmişIsDeterministic=true
? Montaj işaretliSAFE
mi?