2011-12-28 16 views
25

Khi cố gắng xác định dữ liệu sai (thường cần xem xét và xóa thủ công), tôi muốn có một cách dễ dàng để nhìn thấy các ký tự ẩn, chẳng hạn như TAB, Space, Carriage return và Line feed. Có cách nào được tích hợp sẵn không?Cách tốt nhất để xác định các ký tự ẩn trong kết quả của truy vấn trong SQL Server (Query Analyzer) là gì?

Trong một câu hỏi tương tự ở đây trên stackoverflow, liên quan đến Oracle, một hàm DUMP (fieldname) đã được đề xuất, nhưng tôi không biết điều đó có làm cho mọi việc trở nên dễ dàng hơn ngay cả khi một hàm tương ứng sẽ tồn tại trong SQL Server, vì tôi cần để xem Nhân vật trong ngữ cảnh của họ.

Ý tưởng tốt nhất mà tôi có thể đưa ra được thay thế các nhân vật ẩn mong đợi với những người có thể nhìn thấy, như thế này:

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

Có cách nào tốt hơn? Tôi không thích cách này vì có thể có các ký tự ẩn ít phổ biến hơn mà tôi không tính đến như TAB dọc… .. Bật "hiển thị ký tự ẩn", như bạn có thể thực hiện ở hầu hết mọi trình soạn thảo văn bản, sẽ là một tính năng tuyệt vời trong SQL Server Query Analyzer, vì vậy tôi gần như mong đợi rằng nó có thể được thực hiện bằng cách nào đó trong SQL server ... hoặc ít nhất là ai đó có ý tưởng tốt hơn tôi, để thể hiện loại không gian trắng này thông tin.

Tôi chỉ nhận thấy rằng có một cách tích hợp để xem "không gian trắng", không phải trong SQL Query Analyzer, nhưng trong phần giao diện đã từng là trình quản lý SQL Enterprise. Nhấn chuột phải vào một bảng trong cây SQL Management Studio Object Explorer và chọn "Edit top 200 rows". Trong kết quả không gian màu trắng (ít nhất là CR LF) được hiển thị dưới dạng hình vuông trống.

+0

Bạn có tập hợp các ký tự "tốt" hữu hạn không? Bạn có thể sử dụng CLR để sử dụng một thay thế REGEX? – gbn

+0

Phần khó khăn là các ký tự "xấu" đôi khi có thể được cho phép. Đó là lý do tại sao tôi cần quan sát tất cả các ký tự ẩn trong ngữ cảnh văn bản của chúng. Mã REPLACE ở trên thực sự đạt được những gì tôi cần cho thời điểm này (đối với khách hàng này, tôi khá chắc chắn rằng không có ký tự trắng nào khác so với các ký tự cứng trong phần Thay thế ở trên), nhưng tôi đang tìm kiếm một cách đơn giản hơn , toàn năng hơn "hiển thị các ký tự ẩn" tùy chọn, mà sẽ làm việc trên tất cả các dịp. –

Trả lời

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

Không đáp ứng yêu cầu "Tôi cần xem Nhân vật trong ngữ cảnh của họ". –

+0

@MartinSmith Tôi hiển thị 2 trường, nếu nó không đủ .... –

+0

Tôi không có ý tưởng nào tốt hơn BTW. Trừ khi có bất kỳ phông chữ nào thể hiện glyphs cho chúng. –

8

Để tìm thấy chúng, bạn có thể sử dụng này

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

Thay thế EXISTS với lệnh JOIN sẽ cho phép bạn thay thế chúng, nhưng bạn sẽ nhận được nhiều hàng ... Tôi không thể nghĩ đến một con đường xung quanh đó ...

+0

Ah, vâng, đây thực sự là một cách hay để tìm các nhân vật với số lượng char thấp! –

+0

Điều này dường như không hợp lệ SQL – paulwhit

+0

@paulwhit: theo cách nào? – gbn

39

Bạn có thể tạo một hàm giải quyết tất cả các possibilites khoảng trắng và cho phép chỉ những người mà dường như thích hợp:

SELECT dbo.ShowWhiteSpace(myfield) from mytable

Bỏ ghi chú chỉ những trường hợp khoảng trắng bạn muốn kiểm tra cho:


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, điều này có hỗ trợ [ký tự 202C] (http://www.fileformat.info/info/unicode/char/202c/index.htm) không? Tôi đoán là không. –

+2

Bạn cũng nên bao gồm CHAR (0) [NUL]. –

7

Họ cách tôi đã làm nó là bằng cách chọn tất cả các dữ liệu

select * from myTable và sau đó kích chuột phải vào kết quả thiết lập và chọn " Lưu kết quả dưới dạng ... "tệp csv.

Mở tệp csv trong Notepad ++ Tôi thấy các ký tự LF không hiển thị trong tập kết quả SQL Server.

+0

cách tốt nhất! chỉ cần đảm bảo bạn đã bật CRLF dòng mới – cowboysaif

2

Bạn luôn có thể sử dụng hàm DATALENGTH để xác định xem bạn có thêm ký tự khoảng trắng trong trường văn bản hay không. Điều này sẽ không hiển thị văn bản nhưng sẽ hiển thị cho bạn nơi có các ký tự khoảng trắng thừa.

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

Điều này sẽ tạo 11 cho BinaryLength và 10 cho TextLength.

Trong một bảng SQL của bạn sẽ như thế này:

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

Chức năng này có thể sử dụng trong tất cả các phiên bản của SQL Server bắt đầu với năm 2005.

0

tôi đã phải đối mặt với cùng một vấn đề với một nhân vật mà tôi không bao giờ được quản lý để khớp với truy vấn ở đâu - CHARINDEX, LIKE, REPLACE, v.v. không hoạt động. Sau đó, tôi đã sử dụng một giải pháp brute force mà là khủng khiếp, nặng nhưng hoạt động:

: tạo một bản sao của tập dữ liệu hoàn chỉnh - theo dõi các tên gốc với một source_id tham chiếu pk của bảng nguồn (và giữ id nguồn này trong tất cả các bảng tiếp theo). Bước 2: LTRIM RTRIM dữ liệu, và thay thế tất cả các không gian đôi, tab, vv (về cơ bản tất cả các CHAR (1) char (32) bằng một không gian chữ thường toàn bộ bộ cũng Bước 3:.. Thay thế tất cả các ký tự đặc biệt mà bạn biết (có danh sách tất cả các trích dẫn, dấu ngoặc kép, vv) bởi một cái gì đó từ az (tôi đề nghị z). Bước 1: phân chia từng từ thành một bản sao thứ hai, trong đó mỗi từ nằm trong một hàng riêng biệt - phần tách là SUBSTRING dựa trên vị trí của ký tự khoảng trắng - tại thời điểm này, chúng ta nên bỏ qua nơi có một không gian ẩn mà chúng ta không bắt được trước đó.Bước 5: chia từng từ thành bản sao thứ ba, trong đó mỗi chữ nằm trong một hàng riêng biệt (tôi biết nó tạo thành một bảng rất lớn) - theo dõi charindex của mỗi chữ cái trong một cột riêng biệt. Bước 6: Chọn mọi thứ trong bảng trên không phải là LIKE [a-z]. Đây là danh sách các ký tự không xác định mà chúng tôi muốn loại trừ.

Từ đầu ra của bước 6, chúng tôi có đủ dữ liệu để tạo chuỗi chuỗi nguồn để chọn mọi thứ trừ ký tự không xác định mà chúng tôi muốn loại trừ.

Lưu ý 1: có nhiều cách thông minh để tối ưu hóa điều này, tùy thuộc vào kích thước của biểu thức ban đầu (bước 4, 5 và 6 có thể được thực hiện trong một lần).

Note 2: đây không phải là rất nhanh, nhưng cách nhanh nhất để có được điều này làm cho một tập dữ liệu lớn, vì sự chia rẽ của dòng diễn tả bằng lời và bằng chữ vào chữ được thực hiện bởi chuỗi con, mà lát tất cả bàn thành một lát nhân vật. Tuy nhiên, điều này là khá nặng để xây dựng. Với một bộ nhỏ hơn, có thể đủ để phân tích từng bản ghi một và tìm kiếm ký tự không nằm trong danh sách tất cả các ký tự tiếng Anh cộng với tất cả các ký tự đặc biệt.

Các vấn đề liên quan