숫자가 아닌 문자를 문자열에서 어떻게 제거 할 수 있습니까?


10

사용자는 상자에 검색어를 입력하면 해당 값이 저장 프로 시저로 전달되고 데이터베이스의 몇 가지 다른 필드에 대해 검사됩니다. 이러한 필드가 항상 동일한 데이터 유형 인 것은 아닙니다.

하나의 필드 (전화 번호)는 모든 숫자로 구성되므로이를 확인할 때 .Net CLR 기능을 사용하여 문자열에서 숫자가 아닌 모든 문자를 제거합니다.

SELECT dbo.RegexReplace('(123)123-4567', '[^0-9]', '')

문제는이 기능이 다음과 같은 오류가 발생하는 경우 갑자기 작동을 멈추는 것입니다.

메시지 6533, 수준 16, 상태 49, 줄 2
에스컬레이션 정책에 의해 AppDomain MyDBName.dbo [runtime] .1575가 언로드되었습니다. 
응용 프로그램의 일관성. 중요한 리소스에 액세스하는 동안 메모리 부족이 발생했습니다.
System.Threading.ThreadAbortException : 유형 예외 
'System.Threading.ThreadAbortException'이 발생했습니다.
System.Threading.ThreadAbortException : 

이 오류 에 대해 MSDN 에 게시 된 제안을 시도 했지만 여전히 문제가 발생합니다. 현재 64 비트 서버로 전환하는 것은 옵션이 아닙니다.

서버를 다시 시작하면 보유한 모든 메모리가 해제되지만 프로덕션 환경에서는 실행 가능한 솔루션이 아닙니다.

T-SQL 만 사용하여 SQL Server 2005에서 숫자가 아닌 문자를 문자열에서 제거하는 방법이 있습니까?

답변:


14

SO 에서이 T-SQL 함수 를 발견 하여 문자열에서 숫자가 아닌 문자를 제거합니다.

CREATE Function [fnRemoveNonNumericCharacters](@strText VARCHAR(1000))
RETURNS VARCHAR(1000)
AS
BEGIN
    WHILE PATINDEX('%[^0-9]%', @strText) > 0
    BEGIN
        SET @strText = STUFF(@strText, PATINDEX('%[^0-9]%', @strText), 1, '')
    END
    RETURN @strText
END

내 질문은 CLR 기능을 사용하는 대신 T-SQL 대안을 요구하는 것이 었습니다. 의견에 요청하여 추가 CLR 데이터 만 게시했으며 문제를 해결할 수있는 방법을 알고 있다고 생각했습니다. CLR 방법을 수정하는 것을 선호하지만 제 연구에 따르면 "수정"은 현재 사용할 수있는 옵션이 아닌 64 비트 서버로 업그레이드하는 것으로 나타났습니다. 이제 질문의 모든 CLR 정보가 오도 될 수 있으므로 내 질문에서 완전히 제거했습니다.
Rachel

어셈블리를 배포하거나 함수를 만드는 데 사용한 방법에 대한 단서가있을 수 있다고 생각했습니다. "에스컬레이션 정책"을 통해 보안 또는 안전 / 안전하지 않은 액세스와 관련이 있다고 생각했습니다. 더 도움이 될 수는 없지만 32 비트 서버에서는 T-SQL을 사용하는 것이 가장 좋습니다.
Aaron Bertrand

@AaronBertrand 문제 없습니다. 입력 해 주셔서 감사합니다. :) 내년 또는 2 년 내에 64 비트 서버로 이동하기를 희망하므로 CLR 오류를 완전히 해결해야합니다.
Rachel

0

이 솔루션에 대해 확신합니다. 나는 성능에 대해서는 확신하지 못하지만이 접근법에 대한 의견은 환영합니다! 기본적으로 문자열 @String의 각 문자에 대해 문자의 ASCII 값이 '0'과 '9'의 ASCII 값 사이 인 경우 유지하고 그렇지 않으면 공백으로 바꾸십시오.

CREATE FUNCTION [dbo].[fnStripNonNumerics](
             @String VARCHAR(500))
RETURNS VARCHAR(1000)
AS
BEGIN
    DECLARE
          @n INT = 1,
          @Return VARCHAR(100) = ''

    WHILE @n <= LEN(@String)
       BEGIN
          SET @Return = @Return + CASE
                             WHEN ASCII(SUBSTRING(@String, @n, 1)) BETWEEN ASCII('0') AND ASCII('9')
                                THEN SUBSTRING(@String, @n, 1)
                                ELSE ''
                             END
          SET @n = @n + 1
       END

    RETURN CASE
         WHEN @Return = ''
            THEN NULL
            ELSE @Return
         END
END
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.