2014-03-27 2 views
0

그래서 문자열에서 문자와 숫자가 아닌 모든 것을 제거하기 위해 MS SQL을 사용하여 첫 번째 재귀 적 udf를 만들려고합니다. 영문자가 아닌 문자를 제거하기위한 재귀 SQL UDF

이 게시물에 의해 영감을 얻었다 ( Replace with wildcard, in SQL)

CREATE FUNCTION uf_RemoveNonAlphaNumericChar(
        @p_CharIndex int, 
        @p_Value Varchar(max)) 
    RETURNS varchar(max) 
AS 
BEGIN 
    SET @p_CharIndex = PATINDEX('%[^0-9,a-z]%', @p_Value) 
    SET @p_Value = STUFF(@p_Value,@p_CharIndex , 1, SPace(0)) 

    IF @p_CharIndex > 0 
     BEGIN 
     EXEC @p_Value = uf_RemoveNonAlphaNumericChar @p_CharIndex = @p_CharIndex, 
       @p_Value = @p_Value 
     END 
    RETURN @p_Value 
END 

이 내가 XXX###YYYY 세에 부품이 될 수있는 문자열을 분할하기 위해 노력하고있어 더 큰 문제의 한 단계 일 때 일부 부품 수도 실종되었다.

그리고 나는 while 루프 (이 솔루션은 이미 존재하지만 느리게 실행)없이 이것을하려고합니다.

Patindex가 시작 위치에 있으면 (MS SQL에서) 이미 완료되었습니다. 물론, 그것은 또한별로 즐겁지 않을 것입니다. 또는 우스꽝스럽게 채워진 것처럼 ...

+1

가 참고로'PATINDEX'가 시작 postition 수 있습니다 :'PATINDEX를 ('%의 [^ 0-9, AZ] %', SUBSTRING (@p_Value, 2, 99999))'는 문자 2의 검색을 문자열 – JNK

답변

0

문제가 발견되었습니다. 당신이 그것을 찾을 해달라고해도 당신은 기호를 제거하는 단계; 업데이트 대답에) 봐 :

CREATEFUNCTION uf_RemoveNonAlphaNumericChar(
        @p_CharIndex int, 
        @p_Value Varchar(max)) 
    RETURNS varchar(max) 
AS 
BEGIN 
    SET @p_CharIndex = PATINDEX('%[^0-9,a-z]%', @p_Value) 


    IF @p_CharIndex > 0 
     BEGIN 
     SET @p_Value = STUFF(@p_Value,@p_CharIndex , 1, SPace(0)) 
     EXEC @p_Value = uf_RemoveNonAlphaNumericChar @p_CharIndex = @p_CharIndex, 
       @p_Value = @p_Value 
     END 
    RETURN @p_Value 
END 
+0

이것을 사용해 보셨습니까 (함수에서'EXEC')? –

-1

재귀가되어야합니까?

CREATE FUNCTION [dbo].[uf_RemoveNonAlphaNumericChar] 
(
    @val varchar(max) 
) 
RETURNS varchar(1000) 
AS 
BEGIN 
    DECLARE @s VARCHAR(max), @i INT 
    SET @s = @val 

    SET @i = PATINDEX('%[^a-z0-9]%', @s) 
    WHILE @i > 0 
    BEGIN 
     SET @s = REPLACE(@s, SUBSTRING(@s, @i, 1), '') 
     SELECT @i = PATINDEX('%[^a-z0-9]%', @s) 
    END 

    RETURN @s 

END 
+1

에서 시작합니다. while 루프를 사용하는 솔루션이 이미 존재하며 실행되는 동안 while 루프를 사용하지 않고 솔루션을 찾으려고한다는 의문이 있습니다 느린. – JMK

+1

그러나 recursiove 함수를 사용하면 문제가 더욱 느려집니다. Performace-wise 최상의 솔루션은 SQL CLR입니다. – dean

+0

내 연구를 제대로 소화 한 경우이 함수를 테이블 값으로 수정하여 교차 적용과 함께 사용할 수 있습니다. http://sql-sudhir.blogspot.com/2009/10/use-of- function-in-where-clause.html – discosammy