2008-09-09 23 views
7

Tenemos algunos datos de entrada que a veces aparecen con & nbsp caracteres en el extremo.T-SQL trim & nbsp (y otros caracteres no alfanuméricos)

Los datos provienen del sistema de origen como varchar() y nuestros intentos de emitir como error decimal b/c de estos caracteres.

Ltrim y Rtrim no eliminan los caracteres, por lo que estamos obligados a hacer algo como:

UPDATE myTable 
SET myColumn = replace(myColumn,char(160),'') 
WHERE charindex(char(160),myColumn) > 0 

Esto funciona para la & nbsp, pero no es una buena manera de hacer esto para cualquier no ¿caracteres alfanuméricos (o en este caso numéricos)?

Respuesta

9

This page tiene una muestra de cómo se puede eliminar caracteres no alfanuméricos:

-- Put something like this into a user function: 
DECLARE @cString VARCHAR(32) 
DECLARE @nPos INTEGER 
SELECT @cString = '90$%45623 *6%}~:@' 
SELECT @nPos = PATINDEX('%[^0-9]%', @cString) 

WHILE @nPos > 0 
BEGIN 
SELECT @cString = STUFF(@cString, @nPos, 1, '') 
SELECT @nPos = PATINDEX('%[^0-9]%', @cString) 
END 

SELECT @cString 
+0

esto elimina todos menos 0-9 (números). ... así que en realidad no está haciendo _alpha_ numberic: P .. –

1

¿Cómo es la tabla está poblando? Si bien es posible eliminar esto en sql, un mejor enfoque sería cambiar el tipo de columna a int y restregar los datos antes de que se carguen en la base de datos (SSIS). ¿Es esta una opción?

17

Esto eliminará todos los no alfanumérico chracters

CREATE FUNCTION [dbo].[fnRemoveBadCharacter] 
(
    @BadString nvarchar(20) 
) 
RETURNS nvarchar(20) 
AS 
BEGIN 

      DECLARE @nPos INTEGER 
      SELECT @nPos = PATINDEX('%[^a-zA-Z0-9_]%', @BadString) 

      WHILE @nPos > 0 
      BEGIN 
         SELECT @BadString = STUFF(@BadString, @nPos, 1, '') 
         SELECT @nPos = PATINDEX('%[^a-zA-Z0-9_]%', @BadString) 
      END 

      RETURN @BadString 
END 

Uso de la función como:

UPDATE TableToUpdate 
SET ColumnToUpdate = dbo.fnRemoveBadCharacter(ColumnToUpdate) 
WHERE whatever 
+0

Esto es mejor que la respuesta aceptada –

0

Para grandes conjuntos de datos que he tenido mejor suerte con esta función que comprueba el valor ASCII. He agregado opciones para mantener únicamente alfa, numérico o alfanumérico en función de los parámetros.

--CleanType 1 - Remove all non alpanumeric 
--   2 - Remove only alpha 
--   3 - Remove only numeric 
CREATE FUNCTION [dbo].[fnCleanString] (
     @InputString varchar(8000) 
    , @CleanType  int 
    , @LeaveSpaces bit 
) RETURNS varchar(8000) 
AS 
BEGIN 

    -- // Declare variables 
    -- =========================================================== 
    DECLARE @Length  int 
     , @CurLength int = 1 
     , @ReturnString varchar(8000)='' 

    SELECT @Length = len(@InputString) 

    -- // Begin looping through each char checking ASCII value 
    -- =========================================================== 
    WHILE (@CurLength <= (@Length+1)) 
    BEGIN 
     IF (ASCII(SUBSTRING(@InputString,@CurLength,1)) between 48 and 57  AND @CleanType in (1,3)) 
     or (ASCII(SUBSTRING(@InputString,@CurLength,1)) between 65 and 90 AND @CleanType in (1,2)) 
     or (ASCII(SUBSTRING(@InputString,@CurLength,1)) between 97 and 122 AND @CleanType in (1,2)) 
     or (ASCII(SUBSTRING(@InputString,@CurLength,1)) = 32 AND @LeaveSpaces = 1) 
     BEGIN 
      SET @ReturnString = @ReturnString + SUBSTRING(@InputString,@CurLength,1) 
     END 
     SET @CurLength = @CurLength + 1 
    END 

    RETURN @ReturnString 
END 
0

Si el móvil podría comenzar con un signo más (+) Voy a utilizar la función como esta

CREATE FUNCTION [dbo].[Mobile_NoAlpha](@Mobile VARCHAR(1000)) 
RETURNS VARCHAR(1000) 
AS 
BEGIN 
    DECLARE @StartsWithPlus BIT = 0 

    --check if the mobile starts with a plus(+) 
    IF LEFT(@Mobile, 1) = '+' 
    BEGIN 
     SET @StartsWithPlus = 1 

     --Take out the plus before using the regex to eliminate invalid characters 
     SET @Mobile = RIGHT(@Mobile, LEN(@Mobile)-1) 
    END 

    WHILE PatIndex('%[^0-9]%', @Mobile) > 0 
     SET @Mobile = Stuff(@Mobile, PatIndex('%[^0-9]%', @Mobile), 1, '') 

    IF @StartsWithPlus = 1 
     SET @Mobile = '+' + @Mobile 
    RETURN @Mobile 
END 
Cuestiones relacionadas