2009-12-17 18 views
22

Me preguntaron esto hace unas semanas, mientras que sé exactamente cómo hacerlo con un SP o UDF, pero me preguntaba si había un forma rápida y fácil de hacer esto sin estos métodos. Estoy asumiendo que existe y que simplemente no puedo encontrarlo.Consulta de SQL Server 2008 para buscar filas que contengan caracteres no alfanuméricos en una columna

Un punto que tengo que hacer es que, aunque sabemos qué caracteres están permitidos (az, AZ, 0-9) no queremos especificar lo que no está permitido (# @! $ Etc ...) Además, queremos extraer las filas que tienen los caracteres ilegales para que se puedan enumerar al usuario para corregirlos (ya que no tenemos control sobre el proceso de entrada, no podemos hacer nada en ese punto).

He revisado SO y Google anteriormente, pero no pude encontrar nada que hiciera lo que quería. He visto muchos ejemplos que pueden indicar si contiene caracteres alfanuméricos, o no, pero algo que es capaz de sacar un apóstrofo en una oración que no he encontrado en el formulario de consulta.

Tenga en cuenta también que los valores pueden ser null o '' (vacíos) en esta columna varchar.

+2

¿Qué versión de SQL Server? Esto suena como un trabajo de expresiones regulares –

+0

@OMG Ponies He actualizado el tema, es más un "Me pregunto cómo podrías hacer esto" en lugar de necesitarlo para un sistema específico, pero por simplicidades solo digamos que es 2008. – Jay

Respuesta

46

¿Esto no lo hará?

SELECT * FROM TABLE 
WHERE COLUMN_NAME LIKE '%[^a-zA-Z0-9]%' 

Configuración

use tempdb 
create table mytable (mycol varchar(40) NULL) 

insert into mytable VALUES ('abcd') 
insert into mytable VALUES ('ABCD') 
insert into mytable VALUES ('1234') 
insert into mytable VALUES ('efg%^&hji') 
insert into mytable VALUES (NULL) 
insert into mytable VALUES ('') 
insert into mytable VALUES ('apostrophe '' in a sentence') 

SELECT * FROM mytable 
WHERE mycol LIKE '%[^a-zA-Z0-9]%' 

drop table mytable 

Resultados

mycol 
---------------------------------------- 
efg%^&hji 
apostrophe ' in a sentence 
+0

LIKE doesn ' t admite expresiones regulares, solo el comodín. Y no sabemos qué versión actualmente ... –

+0

No necesitamos un RegEx para resolver este problema. A menos que me esté perdiendo algo. – beach

+0

Permítanme reformular: no necesitamos soporte completo de RegEx. Usar la coincidencia de patrón simple que admite LIKE (o PATINDEX) debería ser suficiente. Solo necesitamos encontrar un único carácter que no esté en la lista permitida. – beach

6

servidor SQL tiene el apoyo Regex muy limitado. Puede utilizar PATINDEX con algo como esto

PATINDEX('%[a-zA-Z0-9]%',Col) 

un vistazo a PATINDEX (Transact-SQL)

y Pattern Matching in Search Conditions

+3

Si desea utilizar PATINDEX, tiene que hacer algo como esto: "SELECT * FROM mitabla DONDE PATINDEX ('% [^ a-zA-Z0-9]%', mycol)> 1" – beach

+1

Sí, esto es correcto. Al seleccionarlo en la lista de columnas, solo se mostrará dónde están los valores. –

+0

Éste es cómo utilicé para eliminar filas con caracters no latinos en una columna específica: eliminar de [DefaultConnection] [dbo] [AspNetUsers] donde PATINDEX ('% [a-zA-Z0-9]%',.. país) = 0 –

2

encontré this página con una solución bastante ordenada. Lo que lo hace genial es que obtienes una indicación de qué es el personaje y dónde está. A continuación, proporciona una forma muy sencilla de solucionarlo (que se puede combinar y crear en un código de controlador para ampliar su aplicación).

DECLARE @tablename VARCHAR(1000) ='Schema.Table' 
DECLARE @columnname VARCHAR(100)='ColumnName' 
DECLARE @counter INT = 0 
DECLARE @sql VARCHAR(MAX) 

WHILE @counter <=255 
BEGIN 

SET @sql= 

'SELECT TOP 10 '[email protected]+','+CAST(@counter AS VARCHAR(3))+' as CharacterSet, CHARINDEX(CHAR('+CAST(@counter AS VARCHAR(3))+'),'[email protected]+') as LocationOfChar 
FROM '[email protected]+' 
WHERE CHARINDEX(CHAR('+CAST(@counter AS VARCHAR(3))+'),'[email protected]+') <> 0' 

PRINT (@sql) 
EXEC (@sql) 
SET @counter = @counter + 1 
END 

y luego ...

UPDATE Schema.Table 
SET ColumnName= REPLACE(Columnname,CHAR(13),'') 

crédito a Ayman El-Ghazali.

Cuestiones relacionadas