2011-12-28 18 views
25

Hatalı verileri tespit etmeye çalışırken (genellikle manuel inceleme ve kaldırma gerektiren), SEKME, Boşluk, Taşıma dönüşü ve Satır besleme gibi gizli karakterleri görmenin kolay bir yolunu kullanmak isterim. Bunun için yerleşik bir yol var mı?SQL Server'da (Query Analyzer) bir sorgu sonucu gizli karakterleri tanımlamanın en iyi yolu nedir?

Oracle ile ilgili olarak, bir DUMP (fieldname) işleviyle ilgili olarak stackoverflow üzerinde de benzer bir soru önerildi, ancak SQL Server'da karşılık gelen bir işlev var olsa bile, bu işleri daha kolay hale getirip getirmeyeceğini bilmiyorum. Karakterleri kendi bağlamında görmek. Ben ile gelebilir

en iyi fikir bu gibi görülebiliyor olanlarla beklenen gizli karakterleri değiştirerek edildi:

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

daha iyi bir yolu var mı? Şimdiye kadar hiç hoş görünmeyen gizli karakterler olabileceğinden bu şekilde hoşlanmıyorum çünkü dikey TAB vb. Gibi hemen hemen hiç bir metin editöründe yapabileceğiniz "gizli karakterleri gösterme" yi açma, SQL Server Query Analyzer'da böylesine güzel bir özellik olurdu, bu yüzden neredeyse bir şekilde SQL Server'da yapılabileceğini ümit ediyorum ... ya da en azından birisinin benimkinden daha iyi bir fikri var, bu tür beyaz alanı göstermek için bilgi.

SQL Query Analyzer'da değil, bir zamanlar SQL Enterprise yöneticisi olan arayüzde "white space" görmenin yerleşik bir yolu olduğunu fark ettim. SQL Management Studio Nesne Gezgini ağacındaki bir tabloyu sağ tıklatın ve "En üst 200 satırı düzenle" yi seçin. Sonuçta beyaz boşluk (en azından CR LF) boş kareler olarak görünür.

+0

Sonlu "iyi" karakterler kümeniz var mı? REGEX yerine kullanmak için CLR kullanabilir misiniz? – gbn

+0

Zor kısmı, "kötü" karakterlere bazen izin verilebilmesidir. Bu yüzden tüm gizli karakterleri metinsel bağlamlarında gözlemlemem gerekiyor. Yukarıdaki REPLACE kodu, şu an için neye ihtiyacım olduğuna gerçekten ulaşıyor (bu müşteri için yukarıdaki Replace'da kodlanmış olanlardan daha fazla beyaz boşluk karakteri olmadığından emin değilim), ancak daha basit bir şey arıyordum. Her vesileyle çalışacak daha güvensiz "gizli karakterleri göster" seçeneği. –

cevap

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

"Karakterleri kendi bağlamında görmem gerekiyor" gerekliliğini karşılamıyor. –

+0

@MartinSmith Yeterli değilse 2 alan gösteriyorum .... –

+0

Daha iyi bir fikrim yok BTW. Bunlar için glifler gösteren herhangi bir font olmadığı sürece. –

8

onları bulmak için, yapamam ... bunu

;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) + '%' 
     ) 

bir Bunları DEĞİŞTİRİN sağlayacak JOIN ile MEVCUT Değiştirme kullanabilirsiniz, ancak birden çok satır alırsınız

+0

Ah, evet, bu düşük karakter sayılarına sahip karakterleri bulmak için gerçekten iyi bir yol! –

+0

Bu geçerli SQL – paulwhit

+0

@paulwhit: gibi görünmüyor: Hangi yolla? – gbn

39

tüm boşluk possibilites adresleri bir işlev oluşturmak ve uygun görünüyor sadece bu mümkün kılabilir ... o etrafında bir yol düşünemiyorum:

SELECT dbo.ShowWhiteSpace(myfield) from mytable

Uncomment için test etmek istiyorum sadece bu boşluk vakalar: Onlar yolu bunu sonuca

select * from myTable ve ardından sağ tıklayarak set tüm verileri seçerek oldu yaptı ve seçti


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

Uhm, bu desteği [karakter 202C] yapar (http://www.fileformat.info/info/unicode/char/202c/index.htm)? Sanırım hayır. –

+2

Ayrıca CHAR (0) [NUL] eklemelisiniz. –

7

" Sonuçları ... "bir csv dosyası olarak kaydedin.

Notepad ++ 'da csv dosyasını açma LF karakterlerinin SQL Server sonuç kümesinde görünmediğini gördüm.

+0

en iyi yol! sadece yeni satırda CRLF'nin görünür olduğundan emin olun – cowboysaif

2

Metin alanlarında fazladan boşluk karakterleri olup olmadığını belirlemek için her zaman DATALENGTH işlevini kullanabilirsiniz. Bu, metni görünür yapmaz, ancak fazladan boşluk karakterleri olduğu yerleri gösterir.

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

Bu, BinaryLength için 11 ve TextLength için 10 üretecektir.Bir tabloda

SQL bu istiyorum:

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

Bu fonksiyon, SQL Server'ın tüm sürümlerinde kullanılabilir olan bir karakter ile aynı sorun olduğunu asla karşı karşıya kalmışlardır 2005.

0

ile başlayan Bir sorguyla eşleşmeyi başardı - CHARINDEX, LIKE, REPLACE, vb. çalışmadı. Sonra, ağır korkunç ama çalışan bir kaba kuvvet çözüm kullandık:

Adım 1: veri kümesini bir kopyası yapmak - kaynak tablosunun pk başvuran bir SOURCE_ID orijinal isimleri takip (ve bu kaynak kimliğini sonraki tüm tablolarda saklayın). Adım 2: LTRIM RTRIM verileri ve tüm çift boşluk yerine, etiket, vb (temelde CHAR (1) (32), bir boşluk ile CHAR olarak hem de tüm dizi küçük harfe Adım 3 Tüm.:. Yerini Bildiğiniz tüm özel karakterleri (tüm alıntıların listesini alın, çift tırnaklar, vs.) az bir şeyle (çift önermeler, vs.). Temel olarak standart İngilizce karakterleri az olanları (az yer değiştirin) REPLACE of REPLACE kullanarak bir döngü) Adım 4: her sözcüğün ayrı bir satırda olduğu ikinci bir kopyanın içine kelime bölünmüş - bölme, boşluk karakterlerinin konumuna bağlı olarak SUBSTRING şeklindedir - bu noktada, Daha önce catche yapmadığımız gizli bir alan var.Adım 5: her kelimeyi, her bir harfin ayrı bir satırda bulunduğu üçüncü bir kopyasına ayırın (çok büyük bir tablo oluşturduğunu biliyorum) - her bir harfin ayrı bir sütundaki charindexini takip edin. Adım 6: Yukarıdaki tabloda LIKE [a-z] olmayan her şeyi seçin. Bu, hariç tutmak istediğimiz tanımlanmamış karakterlerin listesi.

6. adımın çıktısından, dışlamak istediğimiz bilinmeyen karakteri değil, her şeyi seçmek için kaynağın bir dizi alt dizesini yapmak için yeterli veriye sahibiz.

Not 1: (adım 4, 5 ve 6, tek bir seferde yapılabilir), özgün ifade boyutuna bağlı olarak, bu, duruma getirmek için akıllı yolu vardır.

Not 2: Bu çok hızlı değil, ama harfler içine kelime ve kelime içine çizgilerin bölünmüş tüm tabloyu dilimler alt dize, tarafından yapılır çünkü en hızlı şekilde bu, büyük bir veri seti için halletmek için bir karakter dilimi içine. Ancak, bu inşa etmek oldukça ağırdır. Daha küçük bir setle, her bir kaydı birer birer ayrıştırmak ve tüm İngilizce karakterlerin yanı sıra tüm özel karakterler listesinde olmayan karakteri aramak yeterli olabilir.

İlgili konular