2011-12-28 10 views
25

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

ओरेकल के बारे में स्टैक ओवरफ्लो पर एक समान प्रश्न में, एक डीयूएमपी (फ़ील्डनाम) फ़ंक्शन का सुझाव दिया गया था, लेकिन मुझे नहीं पता कि क्या यह चौड़ा चीजें आसान बनाता है भले ही SQL सर्वर में कोई संबंधित फ़ंक्शन मौजूद हो, क्योंकि मुझे आवश्यकता है उनके संदर्भ में वर्ण देखने के लिए।

सबसे अच्छा विचार मैं के साथ आ सकता है इस तरह, दृश्य लोगों के साथ की उम्मीद छिपा पात्रों की जगह किया गया था:

SELECT REPLACE(REPLACE(REPLACE(REPLACE(myfield, ' ', '˙'), CHAR(13), '[CR]'), CHAR(10), '[LF]'), CHAR(9), '[TAB]') FROM mytable

वहाँ एक बेहतर तरीका है? मुझे इस तरह से पसंद नहीं है क्योंकि अन्य कम छिपे हुए वर्ण हो सकते हैं जिन्हें मेरे द्वारा ध्यान में नहीं रखा जाता है जैसे लंबवत टैब आदि ... "छिपे हुए वर्ण दिखाएं" चालू करना, जैसा कि आप लगभग किसी भी टेक्स्ट एडिटर में कर सकते हैं, एसक्यूएल सर्वर क्वेरी विश्लेषक में ऐसी अच्छी सुविधा होगी, इसलिए मुझे उम्मीद है कि यह किसी भी तरह से SQL सर्वर में भी किया जा सकता है ... या कम से कम किसी के पास इस तरह की सफेद जगह दिखाने के लिए मेरे से भी बेहतर विचार है जानकारी।

मैंने अभी देखा है कि SQL क्वेरी विश्लेषक में नहीं, "व्हाइट स्पेस" देखने के लिए एक अंतर्निहित तरीका है, लेकिन इंटरफ़ेस के हिस्से में जो एक बार SQL एंटरप्राइज़ प्रबंधक था। SQL प्रबंधन स्टूडियो ऑब्जेक्ट एक्सप्लोरर पेड़ में एक तालिका राइट-क्लिक करें, और "शीर्ष 200 पंक्तियां संपादित करें" का चयन करें। नतीजतन सफेद स्थान (कम से कम सीआर एलएफ) खाली वर्ग के रूप में दिखाई देता है।

+0

क्या आपके पास "अच्छे" पात्रों का एक सीमित सेट है? क्या आप आरईजीएक्स विकल्प का उपयोग करने के लिए सीएलआर का उपयोग कर सकते हैं? – gbn

+0

कठिन हिस्सा यह है कि "खराब" पात्रों को कभी-कभी अनुमति दी जा सकती है। यही कारण है कि मुझे अपने छिपे हुए पात्रों को उनके पाठ संदर्भों में देखना होगा। वास्तव में उपरोक्त संदर्भ कोड जो मुझे इस पल के लिए आवश्यक है प्राप्त करता है (इस ग्राहक के लिए मुझे काफी यकीन है कि ऊपर की जगह में हार्ड-कोड किए गए लोगों की तुलना में कोई अन्य सफेद स्पेस वर्ण नहीं हैं), लेकिन मैं एक सरल खोज रहा था , अधिक omnipotent "छुपे हुए अक्षर दिखाओ" विकल्प, जो सभी अवसरों पर काम करेगा। –

उत्तर

0
select myfield, CAST(myfield as varbinary(max)) ... 
+1

"मुझे उनके संदर्भ में वर्ण देखने की आवश्यकता है" आवश्यकता को पूरा नहीं करता है। –

+0

@ मार्टिनस्मिथ मैं 2 फ़ील्ड दिखाता हूं, अगर यह पर्याप्त नहीं है .... –

+0

मेरे पास कोई बेहतर विचार नहीं है बीटीडब्ल्यू। जब तक कोई फोंट नहीं है जो इनके लिए ग्लिफ दिखाता है। –

8

उन्हें खोजने के लिए, आप इस

;WITH cte AS 
(
    SELECT 0 AS CharCode 
    UNION ALL 
    SELECT CharCode + 1 FROM cte WHERE CharCode <31 
) 
SELECT 
    * 
FROM 
    mytable T 
    cross join cte 
WHERE 
    EXISTS (SELECT * 
     FROM mytable Tx 
     WHERE Tx.PKCol = T.PKCol 
      AND 
       Tx.MyField LIKE '%' + CHAR(cte.CharCode) + '%' 
     ) 

की जगह एक में शामिल हों तो आप उन्हें बदलने के लिए अनुमति देगा के साथ मौजूद है का उपयोग कर सकते हैं, लेकिन आप कई पंक्तियों मिल जाएगा ... मैं नहीं कर सकता कि चारों ओर एक रास्ता के बारे में सोच ...

+0

आह, हाँ, यह वास्तव में कम चार संख्या वाले पात्रों को ढूंढने का एक अच्छा तरीका है! –

+0

यह वैध SQL – paulwhit

+0

@paulwhit नहीं दिखता है: किस तरह से? – gbn

39

आप एक समारोह है कि सभी खाली स्थान के possibilites के पते बना सकते हैं और केवल उन है कि उचित प्रतीत सक्षम हो सकते हैं:

SELECT dbo.ShowWhiteSpace(myfield) from mytable

टिप्पणी हटाएं केवल उन खाली स्थान के मामलों आप के लिए परीक्षण करना चाहते हैं:


CREATE FUNCTION dbo.ShowWhiteSpace (@str varchar(8000)) 
RETURNS varchar(8000) 
AS 
BEGIN 
    DECLARE @ShowWhiteSpace varchar(8000); 
    SET @ShowWhiteSpace = @str 
    SET @ShowWhiteSpace = REPLACE(@ShowWhiteSpace, CHAR(32), '[?]') 
    SET @ShowWhiteSpace = REPLACE(@ShowWhiteSpace, CHAR(13), '[CR]') 
    SET @ShowWhiteSpace = REPLACE(@ShowWhiteSpace, CHAR(10), '[LF]') 
    SET @ShowWhiteSpace = REPLACE(@ShowWhiteSpace, CHAR(9), '[TAB]') 
-- SET @ShowWhiteSpace = REPLACE(@ShowWhiteSpace, CHAR(1), '[SOH]') 
-- SET @ShowWhiteSpace = REPLACE(@ShowWhiteSpace, CHAR(2), '[STX]') 
-- SET @ShowWhiteSpace = REPLACE(@ShowWhiteSpace, CHAR(3), '[ETX]') 
-- SET @ShowWhiteSpace = REPLACE(@ShowWhiteSpace, CHAR(4), '[EOT]') 
-- SET @ShowWhiteSpace = REPLACE(@ShowWhiteSpace, CHAR(5), '[ENQ]') 
-- SET @ShowWhiteSpace = REPLACE(@ShowWhiteSpace, CHAR(6), '[ACK]') 
-- SET @ShowWhiteSpace = REPLACE(@ShowWhiteSpace, CHAR(7), '[BEL]') 
-- SET @ShowWhiteSpace = REPLACE(@ShowWhiteSpace, CHAR(8), '[BS]') 
-- SET @ShowWhiteSpace = REPLACE(@ShowWhiteSpace, CHAR(11), '[VT]') 
-- SET @ShowWhiteSpace = REPLACE(@ShowWhiteSpace, CHAR(12), '[FF]') 
-- SET @ShowWhiteSpace = REPLACE(@ShowWhiteSpace, CHAR(14), '[SO]') 
-- SET @ShowWhiteSpace = REPLACE(@ShowWhiteSpace, CHAR(15), '[SI]') 
-- SET @ShowWhiteSpace = REPLACE(@ShowWhiteSpace, CHAR(16), '[DLE]') 
-- SET @ShowWhiteSpace = REPLACE(@ShowWhiteSpace, CHAR(17), '[DC1]') 
-- SET @ShowWhiteSpace = REPLACE(@ShowWhiteSpace, CHAR(18), '[DC2]') 
-- SET @ShowWhiteSpace = REPLACE(@ShowWhiteSpace, CHAR(19), '[DC3]') 
-- SET @ShowWhiteSpace = REPLACE(@ShowWhiteSpace, CHAR(20), '[DC4]') 
-- SET @ShowWhiteSpace = REPLACE(@ShowWhiteSpace, CHAR(21), '[NAK]') 
-- SET @ShowWhiteSpace = REPLACE(@ShowWhiteSpace, CHAR(22), '[SYN]') 
-- SET @ShowWhiteSpace = REPLACE(@ShowWhiteSpace, CHAR(23), '[ETB]') 
-- SET @ShowWhiteSpace = REPLACE(@ShowWhiteSpace, CHAR(24), '[CAN]') 
-- SET @ShowWhiteSpace = REPLACE(@ShowWhiteSpace, CHAR(25), '[EM]') 
-- SET @ShowWhiteSpace = REPLACE(@ShowWhiteSpace, CHAR(26), '[SUB]') 
-- SET @ShowWhiteSpace = REPLACE(@ShowWhiteSpace, CHAR(27), '[ESC]') 
-- SET @ShowWhiteSpace = REPLACE(@ShowWhiteSpace, CHAR(28), '[FS]') 
-- SET @ShowWhiteSpace = REPLACE(@ShowWhiteSpace, CHAR(29), '[GS]') 
-- SET @ShowWhiteSpace = REPLACE(@ShowWhiteSpace, CHAR(30), '[RS]') 
-- SET @ShowWhiteSpace = REPLACE(@ShowWhiteSpace, CHAR(31), '[US]') 
    RETURN(@ShowWhiteSpace) 
END
+0

उह, क्या यह समर्थन [चरित्र 202C] (http://www.fileformat.info/info/unicode/char/202c/index.htm) करता है? मुझे नहीं लगता। –

+2

आपको चार्ज (0) [एनयूएल] भी शामिल करना चाहिए। –

7

वे जिस तरह से मैं इसे डेटा के सभी का चयन

select * from myTable और उसके बाद परिणाम पर राइट क्लिक सेट के द्वारा किया गया था और चुना " परिणाम के रूप में सहेजें ... "एक सीएसवी फ़ाइल।

नोटपैड ++ में सीएसवी फ़ाइल खोलना मैंने देखा कि एलएफ वर्ण SQL सर्वर परिणाम सेट में दिखाई नहीं दे रहे हैं।

+0

सबसे अच्छा तरीका! बस सुनिश्चित करें कि आपके पास नई सीआरएलएफ दृश्यमान सक्षम है – cowboysaif

2

यह निर्धारित करने के लिए कि आप टेक्स्ट फ़ील्ड्स में अतिरिक्त श्वेत स्थान वर्ण हैं या नहीं, आप हमेशा DATALENGTH फ़ंक्शन का उपयोग कर सकते हैं। यह टेक्स्ट को दृश्यमान नहीं करेगा लेकिन आपको दिखाएगा कि अतिरिक्त सफेद स्पेस वर्ण कहां हैं।

SELECT DATALENGTH('MyTextData ') AS BinaryLength, LEN('MyTextData ') AS TextLength 

यह BinaryLength के लिए 11 और 10 TextLength के लिए उत्पादन करेगा।

एक तालिका में अपने एसक्यूएल इस चाहते हैं:

SELECT * 
    FROM tblA 
    WHERE DATALENGTH(MyTextField) > LEN(MyTextField) 

इस समारोह एसक्यूएल सर्वर के सभी संस्करणों में प्रयोग करने योग्य है के साथ 2005

0

मैं एक चरित्र के साथ एक ही समस्या का सामना करना पड़ा है कि मैं कभी नहीं शुरू एक क्वेरी के साथ मिलान करने में कामयाब रहे - CHARINDEX, LIKE, REPLACE, आदि काम नहीं किया। तब मैं एक जानवर बल समाधान जो भयंकर है, भारी, लेकिन काम करता है का इस्तेमाल किया है:

चरण 1: बनाने के पूरे डेटा की एक प्रतिलिपि - एक SOURCE_ID स्रोत तालिका के pk संदर्भित साथ मूल नाम का ट्रैक रखने (और इस स्रोत आईडी को बाद की सभी तालिकाओं में रखें)। चरण 2: LTRIM RTRIM डेटा, और सभी डबल रिक्त स्थान की जगह, टैब, आदि (मूल रूप से सभी CHAR (1) (32) एक अंतरिक्ष से चार के लिए पूरे सेट लोअरकेस रूप में अच्छी तरह चरण 3:।। की जगह एजे (मैं सुझाव देता हूं) से कुछ विशेष पात्र जिन्हें आप जानते हैं (सभी उद्धरणों, डबल कोट्स इत्यादि की सूची प्राप्त करें)। मूल रूप से उन सभी चीजों को प्रतिस्थापित करें जो मानक अंग्रेजी वर्णों को एज़ द्वारा नहीं हैं (प्रतिस्थापन के नेस्टेड प्रतिस्थापन का उपयोग करके) एक लूप) चरण 4: शब्द को दूसरी प्रतिलिपि में विभाजित करें, जहां प्रत्येक शब्द एक अलग पंक्ति में है - विभाजन 0 वर्णों की स्थिति के आधार पर SUBSTRING है - इस बिंदु पर, हमें उनको याद करना चाहिए जहां एक छिपी हुई जगह है जिसे हमने पहले नहीं पकड़ा था। चरण 5: प्रत्येक शब्द को एक तीसरी प्रतिलिपि में विभाजित करें, जहां प्रत्येक अक्षर एक अलग पंक्ति में है (मुझे पता है कि यह एक बहुत बड़ी तालिका बनाता है) - प्रत्येक अक्षर के चारिंडेक्स को एक अलग कॉलम में ट्रैक रखें। चरण 6: उपर्युक्त तालिका में सब कुछ चुनें जो पसंद नहीं है [ए-जेड]। यह उन अज्ञात पात्रों की सूची है जिन्हें हम बाहर करना चाहते हैं।

चरण 6 के आउटपुट से हमारे पास सब कुछ चुनने के लिए स्रोत के सबस्ट्रिंग की श्रृंखला बनाने के लिए पर्याप्त डेटा है, लेकिन अज्ञात चरित्र जिसे हम बाहर करना चाहते हैं।

नोट 1: मूल अभिव्यक्ति के आकार के आधार पर इसे अनुकूलित करने के स्मार्ट तरीके हैं (चरण 4, 5 और 6 एक बार में किए जा सकते हैं)।

नोट 2: इस बहुत तेजी से नहीं है, लेकिन सबसे तेज़ तरीका यह, एक बड़े डेटा सेट के लिए किया जाना है क्योंकि शब्द और शब्दों के अक्षरों में में लाइनों के विभाजन-स्ट्रिंग है, जो सभी तालिका स्लाइस द्वारा किया जाता है एक चरित्र स्लाइस में। हालांकि, यह निर्माण करने के लिए काफी भारी है। एक छोटे से सेट के साथ, यह प्रत्येक रिकॉर्ड को एक-एक करके पार्स करने के लिए पर्याप्त हो सकता है और ऐसे चरित्र की खोज कर सकता है जो सभी अंग्रेजी वर्णों और सभी विशेष पात्रों की सूची में नहीं है।