2011-12-28 386 views
25

Al tratar de identificar datos erróneos (que a menudo necesitan revisión y eliminación manual), me gustaría una manera fácil de ver los caracteres ocultos, como TAB, Espacio, Retorno de carro y Avance de línea. ¿Hay una forma incorporada para esto?¿Cuál es la mejor manera de identificar caracteres ocultos en el resultado de una consulta en SQL Server (Query Analyzer)?

En una pregunta similar aquí en stackoverflow, con respecto a Oracle, se sugirió una función DUMP (nombre de campo), pero no sé si eso haría las cosas más fáciles incluso si una función correspondiente existiría en SQL Server, ya que necesito para ver los personajes en su contexto.

La mejor idea de que podía llegar a reemplazaba a los personajes ocultos esperados con los visibles, como esto:

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

¿Hay una mejor manera? No me gusta de esta manera ya que podría haber otros caracteres ocultos menos comunes que no son tomados en cuenta por mí, como TAB vertical, etc ... Activar "mostrar caracteres ocultos", como puede hacer en casi cualquier editor de texto, sería una buena característica en SQL Server Query Analyzer, así que casi espero que se pueda hacer de alguna manera en el servidor SQL también ... o al menos que alguien tenga una idea incluso mejor que la mía, para mostrar este tipo de espacio en blanco información

Me acabo de dar cuenta de que hay una forma incorporada de ver "espacio en blanco", no en el Analizador de consultas SQL, sino en la parte de la interfaz que alguna vez fue el administrador SQL Enterprise. Haga clic con el botón derecho en una tabla en el árbol del Explorador de objetos de SQL Management Studio y seleccione "Editar las 200 filas superiores". En el resultado, el espacio en blanco (al menos CR LF) es visible como cuadrados vacíos.

+0

¿Tiene un conjunto finito de "buenos" caracteres? ¿Puedes usar CLR para usar un sustituto REGEX? – gbn

+0

La parte difícil es que los caracteres "malos" a veces pueden permitirse. Es por eso que necesito observar a todos los personajes ocultos en sus contextos textuales. El código REEMPLAZAR arriba realmente logra lo que necesito por el momento (para este cliente estoy bastante seguro de que no hay otros caracteres en el espacio en blanco que los codificados en el Reemplazar arriba), pero estoy buscando una más simple , opción más omnipotente de "mostrar personajes ocultos", que funcionará en todas las ocasiones. –

Respuesta

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

No cumple con el requisito "Necesito ver los caracteres en su contexto". –

+0

@MartinSmith Muestro 2 campos, si no es suficiente .... –

+0

No tengo mejores ideas por cierto. A menos que haya fuentes que muestren glifos para estos. –

8

Para encontrarlos, se puede utilizar este

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

Sustitución del existe con una unión le permitirá reemplazarlos, pero vas a obtener varias filas ... no puedo piensa en una forma de evitar eso ...

+0

¡Ah, sí, esta es una buena forma de encontrar personajes con números bajos! –

+0

Esto no parece ser válido SQL – paulwhit

+0

@paulwhit: ¿de qué manera? – gbn

39

Se puede crear una función que se ocupa de todas las posibilidades de espacio en blanco y permitir que sólo aquellos que parecen apropiadas:

SELECT dbo.ShowWhiteSpace(myfield) from mytable

Descomentar sólo aquellos casos de espacio en blanco que desea probar para:


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, ¿esto es compatible [carácter 202C] (http://www.fileformat.info/info/unicode/char/202c/index.htm)? Supongo que no. –

+2

También debe incluir CHAR (0) [NUL]. –

7

La forma en que lo hice fue seleccionando todos los datos

select * from myTable y haga clic en el conjunto de resultados y eligieron " Guarde los resultados como ... "un archivo csv.

Apertura del archivo csv en Notepad ++ Vi los caracteres LF no visibles en el conjunto de resultados de SQL Server.

+0

¡la mejor manera! solo asegúrate de tener el CRLF de nueva línea visible habilitado – cowboysaif

2

Siempre puede usar la función DATALENGTH para determinar si tiene caracteres adicionales de espacio en blanco en los campos de texto. Esto no hará que el texto sea visible, pero le mostrará dónde hay caracteres de espacio en blanco adicionales.

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

Esto producirá 11 para BinaryLength y 10 para TextLength.

En una tabla de SQL desea:

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

Esta función se puede utilizar en todas las versiones de SQL Server 2005. comenzando con

0

me he enfrentado el mismo problema con un personaje que nunca logró hacer coincidir con una consulta donde - CHARINDEX, LIKE, REPLACE, etc. no funcionó. A continuación, he utilizado una solución de fuerza bruta que es terrible, pesado, pero funciona:

Paso 1: hacer una copia del conjunto completo de datos - mantener un registro de los nombres originales con un source_id referencia al pk de la tabla de origen (y mantenga esta identificación de fuente en todas las tablas subsecuentes). Paso 2: LTRIM RTRIM los datos, y sustituir todos los espacios dobles, tab, etc (básicamente todo el CHAR (1) a CHAR (32) por un espacio minúscula todo el conjunto, así Paso 3:.. Sustituir todos los caracteres especiales que conoces (obtén la lista de todas las comillas, comillas dobles, etc.) por algo de az (sugiero z). Básicamente reemplaza todo lo que no es un carácter inglés estándar por az (usando el SUSTITUTO anidado de REEMPLAZAR en un bucle) Paso 4: dividido por palabra en una segunda copia, donde cada palabra está en una fila separada - la división es SUBSTRING según la posición de los caracteres de espacio - en este punto, deberíamos perder los donde hay un espacio escondido que no recogimos antes. Paso 5: divida cada palabra en una tercera copia, donde cada letra se encuentra en una fila separada (sé que es una tabla muy grande) - lleve un registro del carácter de cada letra en una columna separada. Paso 6: Seleccione todo en la tabla anterior que no sea COMO [a-z]. Esta es la lista de los personajes no identificados que queremos excluir.

Desde la salida del paso 6 tenemos suficientes datos para hacer una serie de subcadenas de la fuente para seleccionar todo excepto el carácter desconocido que queremos excluir.

Nota:: hay formas inteligentes de optimizar esto, dependiendo del tamaño de la expresión original (los pasos 4, 5 y 6 se pueden realizar de una sola vez).

Nota 2: esto no es muy rápido, pero la forma más rápida de hacer esto para un gran conjunto de datos, porque la división de líneas en palabras y palabras en letras se hace por subcadena, que corta toda la tabla en rebanadas de un personaje. Sin embargo, esto es bastante complicado de construir. Con un conjunto más pequeño, puede ser suficiente analizar cada registro uno por uno y buscar caracteres que no estén en una lista de todos los caracteres en inglés más todos los caracteres especiales.

Cuestiones relacionadas