extraer - Consulta de SQL Server 2008 para encontrar filas que contengan caracteres no alfanuméricos en una columna
patindex sql (3)
Hace unas semanas me preguntaron esto mismo, mientras que sé exactamente cómo hacerlo con un SP o UDF, pero me preguntaba si habría una forma rápida y fácil de hacerlo sin estos métodos. Supongo que existe y simplemente no puedo encontrarlo.
Un punto que debo hacer es que aunque sabemos qué caracteres están permitidos (az, AZ, 0-9) no queremos especificar qué no está permitido (# @! $ Etc ...). Además, queremos tirar de las filas que tienen los caracteres ilegales para que puedan ser listados por el usuario para corregirlas (ya que no tenemos control sobre el proceso de entrada, no podemos hacer nada en ese momento).
He revisado SO y Google anteriormente, pero no pude encontrar nada que hiciera lo que quería. He visto muchos ejemplos que pueden decirle si contiene caracteres alfanuméricos o no, pero algo que puede extraer un apóstrofe en una oración que no he encontrado en forma de consulta.
Tenga en cuenta también que los valores pueden ser null
o ''''
(vacíos) en esta columna varchar
.
¿Esto no lo hará?
SELECT * FROM TABLE
WHERE COLUMN_NAME LIKE ''%[^a-zA-Z0-9]%''
Preparar
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
El servidor Sql tiene un soporte Regex muy limitado. Puedes usar PATINDEX con algo como esto
PATINDEX(''%[a-zA-Z0-9]%'',Col)
Echa un vistazo a PATINDEX (Transact-SQL)
He encontrado 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á. Luego, ofrece una forma súper simple de solucionarlo (que puede combinarse e integrarse 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 ''+@columnname+'',''+CAST(@counter AS VARCHAR(3))+'' as CharacterSet, CHARINDEX(CHAR(''+CAST(@counter AS VARCHAR(3))+''),''+@columnname+'') as LocationOfChar
FROM ''+@tablename+''
WHERE CHARINDEX(CHAR(''+CAST(@counter AS VARCHAR(3))+''),''+@columnname+'') <> 0''
PRINT (@sql)
EXEC (@sql)
SET @counter = @counter + 1
END
y entonces...
UPDATE Schema.Table
SET ColumnName= REPLACE(Columnname,CHAR(13),'''')
Crédito a Ayman El-Ghazali.