আমার কাছে এই ছোট সিএলআর রয়েছে যা কলামগুলিতে একটি রেগেক্স ফাংশন করে।
উইন্ডোজ সার্ভার 2012R2 এ এসকিউএল সার্ভার 2014 (12.0.2000) চলাকালীন প্রক্রিয়াটি ক্র্যাশ হয়ে যায়
এমএসজি 0, স্তর 11, রাজ্য 0, লাইন 0 বর্তমান কমান্ডে একটি গুরুতর ত্রুটি ঘটেছে। ফলাফল, যদি থাকে, বাতিল করা উচিত।
এবং যদি আমি করি তবে স্ট্যাক ডাম্প দেয়
select count (*) from table where (CLRREGEX,'Regex')
কিন্তু যখন আমি করি
select * from table where (CLRREGEX,'Regex')
এটি সারি প্রদান করে।
উইন্ডোজ 8.1 এ চলমান একই এসকিউএল সার্ভার বিল্ডে নিখুঁতভাবে কাজ করে।
কোন ধারনা?
- সম্পাদনা এটি যতটা সহজ
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);
}
}
সুতরাং সামান্য পরিবর্তন দ্বারা এখন এটি কাজ করে: সি # এর প্রধান পাঠ টিএসকিউএল এর মতোই বলে মনে হচ্ছে অন্তর্নিহিত ডেটা রূপান্তর সম্পর্কে সতর্ক থাকুন।
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]
বৈশিষ্ট্য বাদে কোডটি দুর্দান্ত দেখাচ্ছে । এটা কি সঠিক কোড? আমি মনে করি না যে এটি সংকলন হবে। ফ্রেমওয়ার্ক সংস্করণ ২.০ / 3.0.০ / non. issue পার্থক্যটি একটি নন-ইস্যু, কারণ আপনি এসকিউএল সার্ভার ২০১৪ যা সিএলআর সংস্করণ ৪ এ আবদ্ধ, আপনি যেহেতু সেই সার্ভারে যা কিছু ব্যবহার করছেন the সার্ভারের সমস্যা 32-বিট দেখাচ্ছে? অন্যান্য সার্ভারের সাথে তুলনা করে এটি কত স্মৃতি? এবং আপনি কি ত্রুটি পেয়ে ঠিক এসকিউএল সার্ভার লগগুলি পরীক্ষা করেছেন?
MatchTimeout
সম্পত্তিটি ব্যবহার করতে পারবেন । তবে আমি মনে করি না যে এটি যদি সত্যিই সমস্যা হয় তবে আপনি যদি কেবল সর্বোচ্চ পাঁচটি পাস করে থাকেন। এটি সম্ভবত সম্ভব যে এই একটি মেশিনে। নেট ফ্রেমওয়ার্কের একটি দূষিত ইনস্টল রয়েছে এবং ট্রাউট ফিশিং ক্রিয়াকলাপ বন্ধ হয়ে যাওয়ার পরে এটি মেরামত করা যেতে পারে ;-)। এছাড়াও, [0-9].*
সহজ তবে অকার্যকর কারণ এটি প্রথম অঙ্কের পরে সমস্ত অক্ষরের সাথে মেলে, যদি কোনও হয়; শুধু [0-9]
একটি জন্য ব্যবহার IsMatch
করা ভাল।
DataAccessKind
গেলেন Read
? এটি কেবল এটি ধীর করে দেয় এবং আপনি কোনও ডেটা অ্যাক্সেস করেন না। এছাড়াও, আমি বুঝতে পারি যে এটি এখন কাজ করছে বলে মনে হচ্ছে, তবে আমি সম্পত্তিটির ToString()
বিপরীতে পদ্ধতিটি ব্যবহারে সতর্ক Value
থাকব কারণ আমি মনে করি না যে টস্ট্রিং এনকোডিংগুলি সঠিকভাবে পরিচালনা করে না বা এর মতো কিছু like আপনার ডাটাবেস কোলেশন সেট করা কি? অবশ্যই, আমি কেবল আপনার উপরে একটি মন্তব্য পুনরায় পড়েছি এবং দেখুন যে কলামটি এনভিচারারের পরিবর্তে VARCHAR। সেই ক্ষেত্রটির কি ডাটাবেসের চেয়ে আলাদা কোলেশন আছে?
SqlFunction
পদ্ধতি হিসাবে চিহ্নিতIsDeterministic=true
? সমাবেশ হিসাবে চিহ্নিত করা হয়SAFE
?