मेरे पास यह छोटा सीएलआर है जो कॉलम में एक स्ट्रिंग पर एक रेजेक्स फ़ंक्शन करता है।
जब Windows Server 2012R2 पर SQL Server 2014 (12.0.2000) पर चल रहा है, तो प्रक्रिया क्रैश हो जाती है
Msg 0, स्तर 11, राज्य 0, लाइन 0 वर्तमान कमांड पर एक गंभीर त्रुटि हुई। यदि कोई परिणाम हैं, तो उनकी उपेक्षा की जानी चाहिए।
और अगर मैं करता हूं तो एक स्टैक डंप देता है
select count (*) from table where (CLRREGEX,'Regex')
लेकिन जब मैं करता हूं
select * from table where (CLRREGEX,'Regex')
यह पंक्तियों को लौटाता है।
विंडोज 8.1 पर चलने वाले एक ही SQL सर्वर बिल्ड पर पूरी तरह से काम करता है।
कोई विचार?
- संपादित करें यह जितना आसान हो सकता है
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);
}
}
इसलिए थोड़े से बदलावों से अब यह काम करता है: C # में मुख्य सबक टीएसक्यूएल के समान है जो अंतर्निहित डेटा रूपांतरण से सावधान है।
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]
विशेषता को छोड़कर, कोड ठीक दिखता है । क्या यह सटीक कोड है? मुझे नहीं लगता कि यह संकलन होगा। फ्रेमवर्क संस्करण 2.0 / 3.0 / 3.5 भेद एक गैर-मुद्दा है क्योंकि आप 4.0 / 4.5 / 4.5.x / etc का उपयोग कर रहे हैं या जो कुछ भी उस सर्वर पर है क्योंकि आप SQL सर्वर 2014 पर हैं जो CLR संस्करण 4 से बंधा है। सर्वर 32-बिट समस्या दिखा रहा है? अन्य सर्वरों की तुलना में इसमें कितनी मेमोरी है? और क्या आपने उस त्रुटि को प्राप्त करने के बाद SQL सर्वर लॉग की जाँच की है?
MatchTimeout
संपत्ति का उपयोग कर सकते हैं। लेकिन मुझे नहीं लगता कि यह वास्तव में मुद्दा है या तो यदि आप केवल 5 वर्ण अधिकतम में गुजर रहे हैं। यह है संभव यह एक मशीन एक .NET फ्रेमवर्क के स्थापित भ्रष्ट है, और है कि एक बार ट्राउट मछली पकड़ने की गतिविधियों रह गए है ;-) ठीक किया जा सकता। इसके अलावा, [0-9].*
सरल लेकिन यह भी अक्षम है क्योंकि यह सभी अंकों से मेल खाता है, यदि कोई है, तो पहले अंक के बाद; सिर्फ [0-9]
एक के लिए उपयोग IsMatch
करना बेहतर है।
DataAccessKind
गए Read
? यह सिर्फ इसे धीमा कर देता है और आप कोई डेटा एक्सेस नहीं कर रहे हैं। इसके अलावा, मुझे एहसास है कि यह अब काम कर रहा है, लेकिन मैं संपत्ति के ToString()
विपरीत विधि का उपयोग करने के साथ सतर्क Value
रहूंगा क्योंकि मुझे नहीं लगता कि ToString ठीक से एन्कोडिंग को संभालती है, या ऐसा कुछ। आपके डेटाबेस से क्या टकराव तय है? बेशक, मैं अभी आपकी एक टिप्पणी ऊपर पढ़ता हूं और देखता हूं कि स्तंभ NVARCHAR के बजाय VARCHAR है। क्या उस फ़ील्ड का डेटाबेस से अलग कॉलेशन है?
SqlFunction
विधि के रूप में चिह्नितIsDeterministic=true
? विधानसभा के रूप में चिह्नित हैSAFE
?