¿Cuál es la mejor manera de verificar si un campo VARCHAR tiene caracteres no ascii? 
CHAR(1)a través de CHAR(31)y CHAR(127)a través de CHAR(255).
Intenté usar PATINDEXy me he encontrado con el siguiente problema.
La comprobación del rango inferior funcionó correctamente.
SELECT *      
FROM mbrnotes      
WHERE PATINDEX('%[' + CHAR(1)+ '-' +CHAR(31)+']%',LINE_TEXT) > 0  
Mis datos tenían tres registros con 0x1E y los tres fueron devueltos.
Pero cuando verifico solo el rango superior:
SELECT *      
FROM mbrnotes      
WHERE PATINDEX('%[' + CHAR(127)+ '-' +CHAR(255)+']%',LINE_TEXT) > 0 
Devuelve cerca de todos los registros de la tabla (recuento de tabla 170737 y recuento devuelto 170735) y dado que mis datos no tenían ningún valor en este rango, creo que no debería haber devuelto ningún registro.
                    
                        sql-server
                                sql-server-2008-r2
                                t-sql
                                
                    
                    
                        Gerhard Weiss
fuente
                
                fuente

Respuestas:
Los rangos en la sintaxis del patrón utilizan las reglas de clasificación de su intercalación.
Use una cláusula de clasificación binaria para que el rango esté ordenado por código de caracteres.
(También lo cambié a
LIKEcomo me parece más obvio quePATINDEX > 0)fuente
Si eres como yo y te has cansado a lo largo de los años buscando estos personajes en los terribles datos de tu empresa, puedes usar esta función o reescribirla para tu propio propósito. Es cierto que es prolijo, pero va más allá de la identificación de caracteres especiales si lo desea: descomente las líneas 19 a 179 para hacerlo.
Si la cadena no contiene valores ascii no imprimibles o extendidos, devuelve NULL.
Y luego, llámalo así:
Salida de muestra:
O
fuente