2010-07-26 16 views
5

को प्रतिस्थापित करें मेरे पास एक कॉलम में कई पंक्तियों में एक गलत प्रतीक (' ') वाली तालिका है।SQL सर्वर 2008: स्ट्रिंग

नीचे TSQL स्क्रिप्ट काम नहीं करती है।

UPDATE S 
SET S.Offering_Details = REPLACE(S.Offering_Details, '�', '...') 
FROM tblSacrifices S 

प्रश्न में स्तंभ nvarchar (230) की डेटाप्रकार है और अशक्त प्रविष्टियों की अनुमति देता है।

डेटा एक दृश्य स्टूडियो विंडोज ऐप के माध्यम से एक्सेल से परिवर्तित एक सीएसवी फ़ाइल से आया था। मूल रूप से डेटा '...' था, लेकिन मुझे लगता है कि शायद शब्द/एक्सेल ने इसे एक चरित्र के रूप में वर्गीकृत किया (बजाय 3 अलग '।')। जब मेरा एप्लिकेशन CSV फ़ाइल से मूल स्ट्रिंग को पढ़ता है (अनजाने में) डेटाबेस में डेटा जमा करने से पहले '...' के साथ '...' को बदल दिया जाता है।

कृपया मदद

+0

प्रभावित स्तंभ के डेटाप्रकार क्या है? –

+0

हाय एड यह nvarchar (230)।इसके अलावा कॉलम नल की अनुमति देता है (यदि इससे कोई फर्क पड़ता है)। – Chris

+5

क्या आप बिल्कुल निश्चित हैं कि डेटा में प्रतीक प्रश्न चिह्न के साथ काला हीरा है और यह नहीं कि यह सिर्फ एक वर्णमाला मुद्दे के कारण प्रदर्शित किया जा रहा है? या शायद एक चरित्र होने के कारण आप उस फ़ॉन्ट में प्रदर्शित नहीं हो सकते जिसे आप इसे देख रहे हैं? –

उत्तर

5

यह पता लगाया। आपकी मदद के लिए सभी धन्यवाद।

मुझे बाइनरी में कनवर्ट करना पड़ा। 65500 से ऊपर के सभी यूनिकोड वर्णों को सामान्य प्रतिस्थापन() काम नहीं करता है।

UPDATE S 
SET S.Offering_Details = REPLACE(S.Offering_Details, nchar(65533) COLLATE Latin1_General_BIN, '...') 
FROM tblSacrifices S 
+0

आप एक चरित्र को तीन के साथ बदल रहे हैं ताकि परिणाम लंबा हो। क्या आप केवल एलीप्सिस सिंगल कैरेक्टर 'एन' ... '' का उपयोग नहीं कर सकते हैं (अन्यथा मुझे लगता है कि आपको कॉलम को व्यापक बनाने या त्रुटि को अनदेखा करने और छंटनी की अनुमति देने के लिए 'SEFT ANSI_WARNINGS OFF' को छीनने के लिए' LEFT' का उपयोग करना होगा। ' –

+0

मैं धन्यवाद मार्टिन देखता हूं। मैंने कॉलम के लिए अधिकतम स्वीकार्य पात्रों को अभी बढ़ाया क्योंकि मैं किसी भी डेटा को खोना नहीं चाहता था। – Chris

1

स्पष्ट है कि चरित्र आप खोज रहे हैं एक प्रमुख एन का उपयोग करके nvarchar है किया जा रहा प्रयास करें:

UPDATE S 
SET S.Offering_Details = REPLACE(S.Offering_Details, N'�', '...') 
FROM tblSacrifices S 

अद्यतन मार्टिन जवाब से चर्चा के आधार पर:

मेरे पास यह सोचने का कोई कारण नहीं है कि यह कार्यात्मक रूप से अलग है जो मैंने ऊपर पोस्ट किया है, लेकिन आप कोशिश कर सकते हैं:

UPDATE S 
SET S.Offering_Details = REPLACE(S.Offering_Details, NCHAR(65533), '...') 
FROM tblSacrifices S 

अद्यतन 2

मैं अपने जवाब अद्यतन करने से पहले से काफी करीबी मार्टिन कोड को पढ़ने के लिए नहीं किया था। क्योंकि यह परिणाम प्रदर्शित करने के एसक्यूएल सर्वर UNICODE फ़ंक्शन का उपयोग करता है, वास्तव में त्रुटि चरित्र 65533.

के नीचे दब गया है यूनिकोड वर्ण 65533 के विवरण के लिए here देखें - यह बुरा डेटा के लिए सामान्य यूनिकोड मान है।

+0

धन्यवाद एड लेकिन यह या तो काम नहीं करता है। कृपया मेरी मूल पोस्ट में मार्टिन को मेरा जवाब देखें। कुछ अतिरिक्त जानकारी प्रश्न का उत्तर देने में सहायता कर सकती हैं। अपडेट 2 के लिए फिर से धन्यवाद – Chris

+0

+1। कोई वैकल्पिक तरीका है अगर कोई विचार है? –

+0

आप दोनों को धन्यवाद। जैसा कि आप शायद पहले ही जानते हैं कि यह भी काम नहीं करता है। क्या 'खराब डेटा' को हटाने के लिए शायद एक तरीका है और फिर प्रतिस्थापित करें, लेकिन फिर हम इसे कहां रखना चाहते हैं। मैं फँस गया हूँ! – Chris

1

संपादित करें:

टिप्पणी में अद्यतन के बाद की कोशिश REPLACE(S.Offering_Details, nchar(65533), '...')

मूल उत्तर:

यह मदद कर सकता है आप इसे का निवारण

declare @s nvarchar(230) 

SELECT @s= ProblemCol 
FROM YourTable 
WHERE ProblemRowId = X; 


set @s = N'日本国'; /*For testing*/ 


WITH N AS 
    (SELECT 1 idx, 
      LEFT(@s,1)ch, 
      UNICODE(LEFT(@s,1)) C 

    UNION ALL 

    SELECT idx+1, 
      SUBSTRING(@s,idx+1,1), 
      UNICODE(SUBSTRING(@s,idx+1,1)) C 
    FROM N 
    WHERE idx<LEN(@s) 
    ) 


    SELECT idx, ch,C 
    FROM  N  

टेस्ट

का परिणाम
idx   ch C 
----------- ---- ----------- 
1   日 26085 
2   本 26412 
3   国 22269 
+0

वैसे - प्रबंधन स्टूडियो में "पाठ के परिणाम" ग्रिड के परिणामों की तुलना में इन वर्णों को बेहतर तरीके से संभालने लगते हैं - कम से कम मेरे सेटअप के साथ। –

+0

धन्यवाद मार्टिन, मैंने परिणामों को अपनी मूल पोस्ट में डाल दिया है। वे आपके जैसा ही हैं। मुझे यकीन है कि इसका मतलब क्या है। – Chris

+0

@ क्रिस - हाँ क्षमा करें मेरा मतलब है कि आप इस लाइन को 'सेट @ एस = एन' 日本国 'को मिटाना चाहते हैं;/* परीक्षण के लिए */'यह सिर्फ एक डेमो देने के लिए था जो यह वापस करेगा। एक बार जब आप समस्या को पता कर लेते हैं तो चरित्र कोड (ओं) आप 'nchar (26085) 'के साथ प्रतिस्थापित कर सकते हैं या जो कुछ भी आप उनसे छुटकारा पाने के लिए चाहते हैं। –

0

इस तरह यूनिकोड फ़ंक्शन का उपयोग करें, यह आपकी मदद कर सकता है:

UPDATE S 
SET S.Offering_Details = REPLACE(S.Offering_Details, NCHAR(UNICODE('�')), '...') 
FROM tblSacrifices S where S.Offering_Details like '%�%'