আমি স্ট্রিংয়ের বাইরে অ-সংখ্যাসূচক অক্ষরগুলি কীভাবে ছাঁটাব?


10

ব্যবহারকারীরা একটি বাক্সে একটি অনুসন্ধান শব্দ প্রবেশ করান, এবং সেই মানটি একটি সঞ্চিত পদ্ধতিতে পাস হয়ে যায় এবং ডাটাবেসে কয়েকটি পৃথক ক্ষেত্রের বিপরীতে পরীক্ষা করা হয়। এই ক্ষেত্রগুলি সর্বদা একই ডেটা ধরণের হয় না।

একটি ক্ষেত্র (ফোন নম্বর) সমস্ত সংখ্যার সমন্বয়ে গঠিত হয়, তাই এটি পরীক্ষা করার সময় একটি। নেট সিএলআর ফাংশন ব্যবহার করে স্ট্রিং থেকে সমস্ত অ-সংখ্যাযুক্ত অক্ষরগুলি সরিয়ে ফেলা হয়।

SELECT dbo.RegexReplace('(123)123-4567', '[^0-9]', '')

সমস্যাটি হ'ল, এই ক্রিয়াকলাপটি হঠাৎ করে নিম্নলিখিত ত্রুটির সাথে উপলক্ষে কাজ করা বন্ধ করে দেয়:

এমএসজি 6533, স্তর 16, রাজ্য 49, লাইন 2
অ্যাপডোমাইন MyDBName.dbo [রানটাইম] .1575 নিশ্চিত করার জন্য এসক্লেশন নীতি দ্বারা লোড করা হয়েছিল 
আপনার প্রয়োগের ধারাবাহিকতা। সমালোচনামূলক সংস্থান অ্যাক্সেস করার সময় মেমরি ফুরিয়েছে।
System.Threading.ThreadAbortException: ধরণের ব্যতিক্রম 
'System.Threading.ThreadAbortException' ফেলে দেওয়া হয়েছিল।
System.Threading.ThreadAbortException: 

আমি এই ত্রুটির জন্য এমএসডিএন-এ পোস্ট পরামর্শগুলি চেষ্টা করেছি , কিন্তু এখনও সমস্যাটি পাচ্ছি। এই সময়ে, একটি 64-বিট সার্ভারে স্যুইচ করা আমাদের পক্ষে বিকল্প নয়।

আমি জানি সার্ভারটি পুনরায় আরম্ভ করা যা মেমরিটি ধারণ করেছে তা প্রকাশ করে, তবে এটি উত্পাদন পরিবেশে কার্যকর সমাধান নয়।

এসকিউএল সার্ভার ২০০৫-এ কেবল টি-এসকিউএল ব্যবহার করে অ-সংখ্যাসূচক অক্ষরগুলি ছড়িয়ে দেওয়ার কোনও উপায় আছে কি?

উত্তর:


14

আমি এই টি-এসকিউএল ফাংশনটি এসও তে পেয়েছি যা একটি স্ট্রিং থেকে অ-সংখ্যাসূচক অক্ষর মুছে ফেলার জন্য কাজ করে।

CREATE Function [fnRemoveNonNumericCharacters](@strText VARCHAR(1000))
RETURNS VARCHAR(1000)
AS
BEGIN
    WHILE PATINDEX('%[^0-9]%', @strText) > 0
    BEGIN
        SET @strText = STUFF(@strText, PATINDEX('%[^0-9]%', @strText), 1, '')
    END
    RETURN @strText
END

আমার প্রশ্নটি সিএলআর ফাংশনটি ব্যবহার করার জন্য একটি টি-এসকিউএল বিকল্প চাইছিল। আমি কেবল অতিরিক্ত সিএলআর ডেটা পোস্ট করেছি কারণ আপনি মন্তব্যগুলিতে এটি চেয়েছিলেন এবং আমি ভেবেছিলাম যে সমস্যাটি সমাধান করার কোনও উপায় আপনি জানেন। আমি সিএলআর পদ্ধতিটি ঠিক করতে পছন্দ করতাম, তবে আমার গবেষণায় প্রমাণিত হয়েছে যে "ফিক্স "টি একটি -৪-বিট সার্ভারে আপগ্রেড করা, যা আমার কাছে এই মুহুর্তে উপলভ্য বিকল্প নয়। আমি এখন উপলব্ধি করেছি যে প্রশ্নের সমস্ত সিএলআর তথ্য বিভ্রান্তিমূলক হতে পারে, তাই আমি এটিকে আমার প্রশ্ন থেকে পুরোপুরি সরিয়েছি।
রাচেল

আমি ভেবেছিলাম যে আপনি যে পদ্ধতিটি সমাবেশটি মোতায়েন করতে বা ফাংশনটি তৈরি করতে ব্যবহার করেছিলেন তা কিছুটা ক্লু পেতে পারে। "বর্ধন নীতি" আমাকে সুরক্ষিত বা নিরাপদ / অনিরাপদ অ্যাক্সেসের সাথে কিছু করার থাকতে পারে বলে ভাবিয়ে তোলে। দুঃখিত, আমি আরও সাহায্য করতে পারি না, তবে একটি 32-বিট সার্ভারে আপনি তার পরিবর্তে টি-এসকিউএল ব্যবহার করে সেরা হতে পারেন।
অ্যারন বার্ট্র্যান্ড

@ অ্যারনবার্ট্র্যান্ড কোনও সমস্যা নেই, ইনপুটটির জন্য ধন্যবাদ :) আমরা আশা করি যে পরের বা দু'বছরের মধ্যে একটি -৪-বিট সার্ভারে স্থানান্তরিত হব, তাই আশা করি এটি সিএলআর ত্রুটি পুরোপুরি পরিষ্কার হয়ে যাবে।
রাহেল

0

আমি এই সমাধানে বেশ আত্মবিশ্বাসী। আমি পারফরম্যান্স সম্পর্কে নিশ্চিত নই তবে এই পদ্ধতির বিষয়ে কোনও মতামত অবশ্যই স্বাগত! মূলত স্ট্রিংয়ের প্রতিটি চরিত্রের জন্য @ স্ট্রিংয়ে যদি অক্ষরের ASCII মান '0' এবং '9' এর ASCII মানগুলির মধ্যে হয় তবে এটি রাখুন, অন্যথায় এটিকে ফাঁকা দিয়ে প্রতিস্থাপন করুন।

CREATE FUNCTION [dbo].[fnStripNonNumerics](
             @String VARCHAR(500))
RETURNS VARCHAR(1000)
AS
BEGIN
    DECLARE
          @n INT = 1,
          @Return VARCHAR(100) = ''

    WHILE @n <= LEN(@String)
       BEGIN
          SET @Return = @Return + CASE
                             WHEN ASCII(SUBSTRING(@String, @n, 1)) BETWEEN ASCII('0') AND ASCII('9')
                                THEN SUBSTRING(@String, @n, 1)
                                ELSE ''
                             END
          SET @n = @n + 1
       END

    RETURN CASE
         WHEN @Return = ''
            THEN NULL
            ELSE @Return
         END
END
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.