Muchas veces requerimos cargar información a alguna tabla, y la fuente contiene cadenas “sucias”. Es decir, esas cadenas incluyen caracteres que no deseamos cargar. Un ejemplo típico es cuando las cadenas traen números y solo requerimos cargar los caracteres, o viceversa.
Navegando por Internet encontré una función en el blog de Pinal Dave, la cual he tomado como base para desarrollar la siguiente función, la cual recibe como parámetros la cadena que se desea evaluar y que acción deseamos ejecutar: Limpiar números o limpiar letras u otros caracteres.
Aquí el código:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
/* --------------------------------------------------------------------------- PROPOSITO |Limpia la cadena de caracteres, quitando los números o las letras según sea el caso --------------------------------------------------------------------------- PARAMETROS DE ENTRADA| @Cadena - Cadena que se quiere evaluar, que tiene letras y números | @Tipo -0 limpia letras y devuelve numeros / 1 limpia números y devuelve letras --------------------------------------------------------------------------- PARAMETROS DE SALIDA | NA --------------------------------------------------------------------------- CREADO POR | Alberto De Rossi (En base ascript de Pinal Dave) FECHA CREACION | 09/06/2014 --------------------------------------------------------------------------- HISTORIAL DE CAMBIOS | FECHA RESPONSABLE MOTIVO | ---------- ------------------- --------------------- --------------------------------------------------------------------------- PRUEBA: SELECT dbo.ufLimpiaCadena('123ABC@@@', 0) AS Números SELECT dbo.ufLimpiaCadena('123ABC@@@', 1) AS Letras --------------------------------------------------------------------------- */ CREATE FUNCTION dbo.ufLimpiaCadena (@Cadena VARCHAR(256), @Tipo bit) RETURNS VARCHAR(256) AS BEGIN DECLARE @Posicion INT, @Caracteres char(8) IF @Tipo = 0 -- Números SET @Caracteres = '%[^0-9]%' ELSE -- Letras SET @Caracteres = '%[^a-z]%' SET @Posicion = PATINDEX(@Caracteres, @Cadena) WHILE @Posicion > 0 BEGIN SET @Cadena = STUFF(@Cadena, @Posicion, 1, '' ) SET @Posicion = PATINDEX(@Caracteres, @Cadena ) END RETURN ISNULL(@Cadena,0) END GO |
Ahora mostramos un par de ejemplos de como trabaja la función:
1. En este ejemplo, pasamos una cadena que contiene letras, números y caracteres no alfanuméricos. También indicamos el segundo parámetro como 0 (cero) para indicarle a la función que deseamos limpiar los caracteres que no son números:
1 |
SELECT dbo.ufLimpiaCadena('123ABC@@@', 0) AS Números |
El resultado es el siguiente:
1 2 3 |
Números ------------------------------------------ 123 |
1 |
(1 row(s) affected) |
2. En este ejemplo, pasamos la misma cadena que contiene letras, números y caracteres no alfanuméricos. Pero en este caso indicamos el segundo parámetro como 1 (uno) para indicarle a la función que deseamos limpiar los caracteres que no son letras:
1 |
SELECT dbo.ufLimpiaCadena('123ABC@@@', 1) AS Letras |
El resultado es el siguiente:
1 2 3 |
Letras ------------------------------------- ABC |
1 |
(1 row(s) affected) |
Mayor información en línea haciendo click en los siguientes enlaces: