2009-11-30 12 views
10

कोई भी SQL सर्वर में किसी फ़ील्ड से विराम चिह्न को हटाने का एक अच्छा तरीका जानता है?एसक्यूएल सर्वर: आप किसी क्षेत्र से विराम चिह्न कैसे हटाते हैं?

मैं

UPDATE tblMyTable SET FieldName = REPLACE(REPLACE(REPLACE(FieldName,',',''),'.',''),'''' ,'') 

में सोच रहा हूँ, लेकिन यह थोड़ा कठिन है जब मैं उदाहरण के लिए विभिन्न चरित्रों की एक बड़ी संख्या को हटाने पर इरादा लगता है:! @ # $%^& *() <>: "

अग्रिम धन्यवाद

उत्तर

15

, आप जैसा कि ऊपर उल्लेख इस तरह के सी # + LINQ के रूप में एक आवेदन भाषा में ऐसा होगा।

यदि आप इसे टी-एसक्यूएल में पूरी तरह से करना चाहते हैं, तो एक तरह से चीजों को साफ करने वाला एक टेबल तैयार करना होगा जिसमें सभी विराम चिह्न जिन्हें आप निकालना चाहते थे।

CREATE TABLE Punctuation 
(
    Symbol VARCHAR(1) NOT NULL 
) 

INSERT INTO Punctuation (Symbol) VALUES('''') 
INSERT INTO Punctuation (Symbol) VALUES('-') 
INSERT INTO Punctuation (Symbol) VALUES('.') 

अगला, आप इनपुट स्ट्रिंग से सभी विराम चिह्नों को हटाने के लिए SQL में एक फ़ंक्शन बना सकते हैं।

CREATE FUNCTION dbo.fn_RemovePunctuation 
(
    @InputString VARCHAR(500) 
) 
RETURNS VARCHAR(500) 
AS 
BEGIN 
    SELECT 
     @InputString = REPLACE(@InputString, P.Symbol, '') 
    FROM 
     Punctuation P 

    RETURN @InputString 
END 
GO 

तो फिर तुम सिर्फ अपने अद्यतन बयान में समारोह कॉल कर सकते हैं

UPDATE tblMyTable SET FieldName = dbo.fn_RemovePunctuation(FieldName) 
+0

@ टीआईएमसी: बहुत धन्यवाद मुझे यह समाधान पसंद आया और इसे लागू किया, लेकिन एक समस्या के साथ आया। एक बार जब मैं विराम चिह्न लेता हूं तो मैं इसे एक गणना वाले कॉलम में उपयोग करने का इरादा रखता हूं जो कि जारी रहता है ताकि मैं उस पर एक पूर्ण पाठ अनुक्रमणिका बना सकूं। हालांकि मैं इस विधि का उपयोग करने वाले कॉलम को जारी नहीं रख सकता। कोई विचार? –

3

आप एसक्यूएल सर्वर में रेगुलर एक्सप्रेशन का उपयोग कर सकते हैं - यहाँ एसक्यूएल 2005 को आधार में एक लेख है:

http://msdn.microsoft.com/en-us/magazine/cc163473.aspx

+0

यह हो सकता है कि सीएलआर आपके पर्यावरण में उपयोग नहीं किया जा सकता – gbn

+0

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

0

यदि यह एक बंद बात है, मैं LINQPad में एक सी # + LINQ का उपयोग करते नियमित अभिव्यक्ति के साथ काम करने के लिए होगा।

यह तेज़ और आसान है और आपको सीएलआर संग्रहीत प्रक्रिया की स्थापना करने और फिर अपने आप को साफ करने की प्रक्रिया को पार करने की आवश्यकता नहीं है।

+0

बहुत बहुत धन्यवाद, यह इस मामले में एक चीज नहीं है, लेकिन भविष्य में उपयोग करने के लिए यह एक अच्छा दिखने वाला टूल है। चीयर्स। –

1

मैं इसे एक साधारण स्केलर यूडीएफ में लपेटूंगा ताकि सभी स्ट्रिंग सफाई एक ही स्थान पर हो, यदि इसकी आवश्यकता हो।

तो फिर तुम यह सम्मिलित करें पर भी आदर्श रूप में उपयोग कर सकते हैं ...

6

2 समाधान

समाधान 1 का प्रस्ताव कर रहा हूँ: एक शोर तालिका बनाने और खाली रिक्त स्थान साथ शोर की जगह

उदाहरण

DECLARE @String VARCHAR(MAX) 
DECLARE @Noise TABLE(Noise VARCHAR(100),ReplaceChars VARCHAR(10)) 
SET @String = 'hello! how * > are % u (: . I am ok :). Oh nice!' 

INSERT INTO @Noise(Noise,ReplaceChars) 
SELECT '!',SPACE(1) UNION ALL SELECT '@',SPACE(1) UNION ALL 
SELECT '#',SPACE(1) UNION ALL SELECT '$',SPACE(1) UNION ALL 
SELECT '%',SPACE(1) UNION ALL SELECT '^',SPACE(1) UNION ALL 
SELECT '&',SPACE(1) UNION ALL SELECT '*',SPACE(1) UNION ALL 
SELECT '(',SPACE(1) UNION ALL SELECT ')',SPACE(1) UNION ALL 
SELECT '{',SPACE(1) UNION ALL SELECT '}',SPACE(1) UNION ALL 
SELECT '<',SPACE(1) UNION ALL SELECT '>',SPACE(1) UNION ALL 
SELECT ':',SPACE(1) 

SELECT @String = REPLACE(@String, Noise, ReplaceChars) FROM @Noise 
SELECT @String Data 

समाधान 2: एक संख्या तालिका के साथ

DECLARE @String VARCHAR(MAX) 
SET @String = 'hello! & how * > are % u (: . I am ok :). Oh nice!' 

;with numbercte as 
(
select 1 as rn 
union all 
select rn+1 from numbercte where rn<LEN(@String) 
) 
select REPLACE(FilteredData,'&#x20;',SPACE(1)) Data from 
(select SUBSTRING(@String,rn,1) 
from numbercte 
where SUBSTRING(@String,rn,1) not in('!','*','>','<','%','(',')',':','!','&','@','#','$') 

for xml path(''))X(FilteredData) 

आउटपुट (दोनों मामलों)

डाटा

hello how are u . I am ok . Oh nice 

नोट- मैंने अभी कुछ शोर डाले हैं। आपको आवश्यक शोर डालने की आवश्यकता हो सकती है।

आशा इस मदद करता है

+0

@ प्यूड। बहुत बहुत धन्यवाद। मैं एक अलग विचार का उपयोग कर समाप्त हुआ, लेकिन यह काम किया और मेरे सवाल का जवाब दिया। हालांकि आपके लिए एक सवाल है, मुझे इस डेटा को एक गणना वाले कॉलम में उपयोग करने की आवश्यकता है, लेकिन मैं इसे वहां जारी नहीं रख सकता। कोई विचार? मैं शायद इसके लिए एक नया सवाल बनाउंगा। एक बार फिर धन्यवाद। –

0

आप के लिए PATINDEX उपयोग नहीं कर सकते केवल संख्या और अक्षरों के बजाय अनुमान लगाना क्या विराम चिह्न क्षेत्र में हो सकता है की कोशिश कर रहा शामिल हैं? (अगर मेरे पास कोड तैयार था, तो स्नैकी होने की कोशिश नहीं कर रहा था, मैं इसे साझा करूंगा ... लेकिन यह वही है जो मैं ढूंढ रहा हूं)।

लगता है जैसे आप अपने प्रश्नों में कार्यों की जगह का एक विशाल सूची से बचने के लिए एक कस्टम समारोह बनाने की जरूरत - यहाँ एक अच्छा उदाहरण है:

http://www.codeproject.com/KB/database/SQLPhoneNumbersPart_2.aspx?display=Print

9

मैं एक मेज बनाने से बचना चाहते थे और चाहते थे अक्षरों और अंकों को छोड़कर सबकुछ हटाने के लिए।

DECLARE @p int 
DECLARE @Result Varchar(250) 
DECLARE @BadChars Varchar(12) 
SELECT @BadChars = '%[^a-z0-9]%' 
-- to leave spaces - SELECT @BadChars = '%[^a-z0-9] %' 

SET @Result = @InStr 

SET @P =PatIndex(@BadChars,@Result) 
WHILE @p > 0 BEGIN 
    SELECT @Result = Left(@Result,@p-1) + Substring(@Result,@p+1,250) 
    SET @P =PatIndex(@BadChars,@Result) 
    END 
+0

साफ चाल है लेकिन यह दो गुना जितना धीमा है ... – Chris

संबंधित मुद्दे