복붙노트

[SQL] T-SQL 트림 & NBSP (및 기타 영숫자가 아닌 문자)

SQL

T-SQL 트림 & NBSP (및 기타 영숫자가 아닌 문자)

우리는 때때로 끝에 NBSP 문자 및 나타납니다 일부 입력 데이터를 가지고있다.

데이터는 소스 시스템 VARCHAR로 ()와 소수점으로 이러한 문자의 B / C 실패 캐스팅에 우리의 시도에서 제공됩니다.

우리는 같은 일을 할 수밖에 있도록 LTRIM 및 RTRIM는 문자를 제거하지 마십시오 :

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

이것을 & NBSP에 대한 작동하지만 문자가 아닌 숫자 (또는이 경우 숫자에서)이 작업을 수행 할 수있는 좋은 방법은 무엇입니까?

해결법

  1. ==============================

    1.이 페이지는 영숫자가 아닌 문자를 제거하는 방법의 샘플이 있습니다

    이 페이지는 영숫자가 아닌 문자를 제거하는 방법의 샘플이 있습니다

    -- 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 
    
  2. ==============================

    2.이것은 모든 영숫자가 아닌 문자를 제거합니다

    이것은 모든 영숫자가 아닌 문자를 제거합니다

    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
    

    기능을 같이 사용합니다 :

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

    3.테이블이 어떻게 채워지? 이 SQL 더 나은 방법이 스크럽 할 수 있지만 int와 열 유형을 변경하는 것입니다 그리고 그것은 데이터베이스 (SSIS)에로드되기 전에 데이터를 문질러. 이 옵션인가?

    테이블이 어떻게 채워지? 이 SQL 더 나은 방법이 스크럽 할 수 있지만 int와 열 유형을 변경하는 것입니다 그리고 그것은 데이터베이스 (SSIS)에로드되기 전에 데이터를 문질러. 이 옵션인가?

  4. ==============================

    4.대규모 데이터 세트를 위해 나는이 작동하는지 확인 ASCII 값으로 더 좋은 행운이 있었다. 나는 매개 변수에 따라 숫자 또는 숫자 만 알파를 유지하는 옵션을 추가했습니다.

    대규모 데이터 세트를 위해 나는이 작동하는지 확인 ASCII 값으로 더 좋은 행운이 있었다. 나는 매개 변수에 따라 숫자 또는 숫자 만 알파를 유지하는 옵션을 추가했습니다.

    --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
    
  5. ==============================

    5.모바일은 플러스 (+)로 시작 수 있다면이 같은 기능을 사용합니다

    모바일은 플러스 (+)로 시작 수 있다면이 같은 기능을 사용합니다

    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
    
  6. from https://stackoverflow.com/questions/52315/t-sql-trim-nbsp-and-other-non-alphanumeric-characters by cc-by-sa and MIT license