2015-01-21 2 views
0

더 나은 데이터 유효성 검사를 받기 전부터 회사의 데이터베이스에서 문자열을 삭제하려고합니다. 그러나 기능이 작동하지 않습니다. 필자는 @Pattern 문자열에 '['를 할당한다고 알았지 만 그 이유는 모르겠습니다. 가 (당신이 전에 DB 접두사를 추가해야합니다SQL - 문자열에서 영숫자 이외의 문자 선택을 제거하십시오.

/* Remove select non-alphanumeric characters from a string */ 

CREATE FUNCTION [CleanString] (@Str VARCHAR(max)) 

RETURNS VARCHAR(max) AS 
BEGIN 

DECLARE @BadIndex SMALLINT, -- Index of bad character 
     @Pattern CHAR(132) -- Characters to look for (min length is # chars + 4 for %[]% enclosing) 

SELECT @Pattern = 
'%[' 
    /* +CHAR(00) */ +CHAR(01) +CHAR(02) +CHAR(03) +CHAR(04) +CHAR(05) +CHAR(06) +CHAR(07) +CHAR(08) +CHAR(09) 
    +CHAR(10) +CHAR(11) +CHAR(12) +CHAR(13) +CHAR(14) +CHAR(15) +CHAR(16) +CHAR(17) +CHAR(18) +CHAR(19) 
    +CHAR(20) +CHAR(21) +CHAR(22) +CHAR(23) +CHAR(24) +CHAR(25) +CHAR(26) +CHAR(27) +CHAR(28) +CHAR(29) 
    +CHAR(30) +CHAR(31) /* +CHAR(32) */ +CHAR(33) +CHAR(34) +CHAR(35) +CHAR(36) /* +CHAR(37) */ +CHAR(38) +CHAR(39) 
    +CHAR(40) +CHAR(41) +CHAR(42) +CHAR(43) +CHAR(44) +CHAR(45) /* +CHAR(46) */ +CHAR(47) /* +CHAR(48) +CHAR(49) 
    +CHAR(50) +CHAR(51) +CHAR(52) +CHAR(53) +CHAR(54) +CHAR(55) +CHAR(56) +CHAR(57) */ +CHAR(58) +CHAR(59) 
    +CHAR(60) +CHAR(61) +CHAR(62) +CHAR(63) /* +CHAR(64) +CHAR(65) +CHAR(66) +CHAR(67) +CHAR(68) +CHAR(69) 
    +CHAR(70) +CHAR(71) +CHAR(72) +CHAR(73) +CHAR(74) +CHAR(75) +CHAR(76) +CHAR(77) +CHAR(78) +CHAR(79) 
    +CHAR(80) +CHAR(81) +CHAR(82) +CHAR(83) +CHAR(84) +CHAR(85) +CHAR(86) +CHAR(87) +CHAR(88) +CHAR(89) 
    +CHAR(90) +CHAR(91) */ +CHAR(92) /* +CHAR(93) */ +CHAR(94) /* +CHAR(95) */ +CHAR(96) /* +CHAR(97) +CHAR(98) +CHAR(99) 
    +CHAR(100) +CHAR(101) +CHAR(102) +CHAR(103) +CHAR(104) +CHAR(105) +CHAR(106) +CHAR(107) +CHAR(108) +CHAR(109) 
    +CHAR(110) +CHAR(111) +CHAR(112) +CHAR(113) +CHAR(114) +CHAR(115) +CHAR(116) +CHAR(117) +CHAR(118) +CHAR(119) 
    +CHAR(120) +CHAR(121) +CHAR(122) */ +CHAR(123) +CHAR(124) +CHAR(125) +CHAR(126) +CHAR(127) 
+']%', 

@BadIndex = PATINDEX(@Pattern, @Str) -- Find first bad character index 

WHILE @BadIndex > 0 
    BEGIN 
     SELECT 
      @Str = STUFF(@Str, @BadIndex, 1, ' ') -- Swap bad char for a space 
      ,@BadIndex = PATINDEX(@Pattern, @Str) -- Find next bad character index 
    END 

RETURN @Str 
END 

테스트 :

코드는 함수 (당신이 함수 이름 전에 DB 접두사를 추가해야합니다)을 다시 만드는 함수 이름) :

select CleanString('woqp ienv8 90()*&@ #$! skllj_asdf') as test 

결과 :

'woqp ienv8 90()*&@ #$! skllj_asdf' 

도와 주셔서 감사합니다.

+2

CHR (00) C-Style을 "문자열 끝"으로 해석 할 수 있습니까? 첫 번째 문자 만 제거하고 CHR (1)부터 시작하십시오. – LSerni

+0

Char 값 0 - 31은 제어 코드로 프린터와 같은 주변 장치를 제어하는 ​​데 사용할 수있는 인쇄 할 수없는 문자입니다. 일단 제거하면 초기 '['보다 더 많이 볼 수 있습니다. 귀하의 실제 질문에 관해서, 나는 당신을 따를 지 모르겠다 .... 당신의 입력과 결과는 똑같은 문자열입니다. – JMK

+0

바꿀 값이있는 테이블을 만드는 것이 더 쉬울 수도 있습니다. 그런 다음 주어진 문자를 대체하는 테이블 값 함수를 만듭니다. 그런 다음 더 많은 유지 보수가 가능한 코드의 모든 값을 십자가에 적용하고 위생적으로 사용할 수 있습니다. –

답변

2

내가 알아 차릴 두 가지가 있습니다. 첫째, @patindex에는 와일드 카드가 있어야합니다. 둘째, 아마 루프 안쪽으로 돌아가고 싶지 않을 것입니다.

당신은 다음과 같은 논리를 시도 할 수 있습니다 :

SET @Pattern = '%' + @Pattern + '%'; 
SET @BadIndex = PATINDEX(@Pattern, @Str); -- Find first bad character index 

WHILE @BadIndex > 0 
    SELECT @Str = STUFF(@Str, @BadIndex, 1, ' '), -- Swap bad char for a space 
      @BadIndex = PATINDEX(@Pattern, @Str); -- Find next bad character index 
END; 

RETURN @Str; 

편집 :

문제는 당신 declare 문입니다. varchar() 대신에 패턴을 char() (으)로 선언했습니다. 즉, 패턴은 오른쪽 공백으로 채워지며 패턴은 절대 일치하지 않습니다.

그냥이 변경 :

DECLARE @BadIndex SMALLINT, -- Index of bad character 
     @Pattern CHAR(132) -- Characters to look for (min length is # chars + 4 for %[]% enclosing) 

사람 :

DECLARE @BadIndex SMALLINT, -- Index of bad character 
     @Pattern VARCHAR(8000) -- Characters to look for (min length is # chars + 4 for %[]% enclosing) 

나는 그것을 테스트하고 작동이 시간.

+0

'patindex()'는 기본적으로 와일드 카드가 포함 된 것처럼 동작하지만 확실하게 추가했습니다. – zhespelt

+0

@zhespelt ... 와일드 카드 사용 여부에 관계없이 'patindex()'를 테스트하는 것은 쉽지만 일반적으로 다른 결과를 얻는다. 다른 데이터베이스에서는 일반 표현식에 일반적으로 와일드 카드가 필요하지 않습니다. –

+0

굉장합니다, 고마워요! – zhespelt

관련 문제