How do I remove extended ASCII characters from a string in T-SQL?

前端 未结 5 659
忘了有多久
忘了有多久 2020-11-30 06:00

I need to filter out (remove) extended ASCII characters from a SELECT statement in T-SQL.

I\'m using a stored procedure to do so.

Expected input:

<         


        
5条回答
  •  暗喜
    暗喜 (楼主)
    2020-11-30 06:47

    The solution provided by amit kohan works, but was to slow for me. With large string data, the iteration trough each character is not optimal. I've made the following function, with isn't very compact but fast.

    CREATE FUNCTIONdbo.F_StripLowAscii
    (
       @Name nvarchar(max)
    )
    RETURN nvarchar(max) as
    BEGIN
    DECLARE @Result nvarchar(max) 
    
        If @Name IS NULL 
          RETURN @Name 
    
        DECLARE @BlankRange VARCHAR(15) 
        DECLARE @FoundAt INTEGER 
    
        -- ASCII CHAR #0 needs a special treatment
        SET @BlankRange = '%[' + CHAR(0) + ']%' 
        SET @FoundAt = PATINDEX(@BlankRange ,@Name COLLATE SQL_Latin1_General_CP850_Bin) 
        WHILE @FoundAt > 0 
        BEGIN 
            SET @name = left(@name, @FoundAt-1 ) + SUBSTRING(@name, @FoundAt+1, LEN(@Name))
            SET @FoundAt = PATINDEX(@BlankRange ,@Name COLLATE SQL_Latin1_General_CP850_Bin) 
        END 
    
    
        SET @BlankRange = '%[' + CHAR(1)+'-'+CHAR(8) + ']%' 
        SET @FoundAt = PATINDEX(@BlankRange ,@Name COLLATE SQL_Latin1_General_CP850_Bin) 
        WHILE @FoundAt > 0 
        BEGIN 
            SET @name = Replace(@Name, SUBSTRING(@Name, @FoundAt,1),'')
            SET @FoundAt = PATINDEX(@BlankRange ,@Name COLLATE SQL_Latin1_General_CP850_Bin) 
        END 
    
        SET @BlankRange = '%[' + CHAR(11)+'-'+CHAR(12) + ']%' 
        SET @FoundAt = PATINDEX(@BlankRange ,@Name COLLATE SQL_Latin1_General_CP850_Bin) 
        WHILE @FoundAt > 0 
        BEGIN 
            SET @name = Replace(@Name, SUBSTRING(@Name, @FoundAt,1),'')
            SET @FoundAt = PATINDEX(@BlankRange ,@Name COLLATE SQL_Latin1_General_CP850_Bin) 
        END 
    
        SET @BlankRange = '%[' + CHAR(14)+'-'+CHAR(31) + ']%' 
        SET @FoundAt = PATINDEX(@BlankRange ,@Name COLLATE SQL_Latin1_General_CP850_Bin) 
        WHILE @FoundAt > 0 
        BEGIN 
            SET @name = Replace(@Name, SUBSTRING(@Name, @FoundAt,1),'')
            SET @FoundAt = PATINDEX(@BlankRange ,@Name COLLATE SQL_Latin1_General_CP850_Bin) 
        END 
    
        RETURN @Name 
    
    END
    GO
    

提交回复
热议问题