मैं गैर-संख्यात्मक वर्णों को एक स्ट्रिंग से कैसे निकाल सकता हूं?


10

उपयोगकर्ता एक बॉक्स में एक खोज शब्द दर्ज करते हैं, और यह मान संग्रहीत प्रक्रिया में जाता है और डेटाबेस में कुछ अलग क्षेत्रों के खिलाफ जांच की जाती है। ये फ़ील्ड हमेशा एक ही डेटा प्रकार के नहीं होते हैं।

एक फ़ील्ड (फ़ोन नंबर) में सभी संख्याएँ होती हैं, इसलिए जब यह जाँचता है तो .Net CLOS फ़ंक्शन का उपयोग करके स्ट्रिंग से सभी गैर-संख्यात्मक वर्णों को हटा देता है।

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

समस्या यह है, यह फ़ंक्शन अचानक इस त्रुटि के साथ काम करना बंद कर देता है:

एमएसजी 6533, लेवल 16, स्टेट 49, लाइन 2
AppDomain MyDBName.dbo [रनटाइम] .1575 को सुनिश्चित करने के लिए एस्केलेशन पॉलिसी द्वारा अनलोड किया गया था 
आपके आवेदन की संगति। महत्वपूर्ण संसाधन तक पहुँचने के दौरान मेमोरी ऑफ़ हो गई।
System.Threading.ThreadAbortException: अपवाद का प्रकार 
'System.Threading.ThreadAbortException' को फेंक दिया गया था।
System.Threading.ThreadAbortException: 

मैंने इस त्रुटि के लिए MSDN पर पोस्ट किए गए सुझावों की कोशिश की है , लेकिन अभी भी समस्या हो रही है। इस समय, 64-बिट सर्वर पर स्विच करना हमारे लिए कोई विकल्प नहीं है।

मुझे पता है कि सर्वर ने जो भी मेमोरी रखी है, उसे फिर से शुरू करना जानता है, लेकिन यह उत्पादन वातावरण में व्यवहार्य समाधान नहीं है।

क्या केवल SQL सर्वर 2005 में T-SQL का उपयोग करके गैर-संख्यात्मक वर्णों को स्ट्रिंग से बाहर निकालने का एक तरीका है?

जवाबों:


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

मेरा सवाल सीएलआर फ़ंक्शन का उपयोग करने के लिए एक टी-एसक्यूएल विकल्प के लिए पूछ रहा था। मैंने केवल अतिरिक्त सीएलआर डेटा पोस्ट किया था क्योंकि आपने टिप्पणियों में इसके लिए कहा था, और मुझे लगा कि आप समस्या को ठीक करने का एक तरीका जानते हैं। मैं सीएलआर विधि को ठीक करना पसंद करूंगा, हालांकि मेरे शोध से पता चला है कि "फिक्स" को 64-बिट सर्वर में अपग्रेड करना है, जो इस समय मेरे लिए उपलब्ध विकल्प नहीं है। मुझे अब एहसास हुआ कि प्रश्न में सभी सीएलआर जानकारी भ्रामक हो सकती है, इसलिए मैंने इसे अपने प्रश्न से पूरी तरह से हटा दिया।
राहेल

मैंने सोचा था कि हो सकता है कि आप जिस विधि का उपयोग असेंबली को तैनात करने या फ़ंक्शन बनाने के लिए कर रहे हों, वह कुछ सुराग दे सके। "वृद्धि नीति" ने मुझे लगता है कि यह सुरक्षा या सुरक्षित / असुरक्षित पहुंच के साथ कुछ करने के लिए हो सकता है। क्षमा करें, मैं अधिक मददगार नहीं हो सकता, लेकिन 32-बिट सर्वर पर आप इसके बजाय टी-एसक्यूएल का उपयोग करना सबसे अच्छा हो सकता है।
हारून बर्ट्रेंड

@AaronBertrand कोई समस्या नहीं, इनपुट के लिए धन्यवाद :) हम अगले एक या दो साल के भीतर 64-बिट सर्वर पर जाने की उम्मीद करते हैं, इसलिए उम्मीद है कि पूरी तरह से सीएलआर त्रुटि को साफ करना चाहिए।
राहेल

0

मैं इस समाधान में बहुत आश्वस्त हूं। मैं प्रदर्शन के बारे में निश्चित नहीं हूं लेकिन इस दृष्टिकोण के बारे में कोई राय निश्चित रूप से स्वागत योग्य है! मूल रूप से स्ट्रिंग @String में प्रत्येक वर्ण के लिए यदि वर्ण का 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.