2012-03-13 100 views
0

我有一個測試功能,可以清理電話號碼,只允許存儲n和字符「x」或「X」。我把它放在了它的大部分地方,除了它允許我不想要的多個x。如果你發現潛在的問題,任何人都可以幫助我將它添加到正則表達式中嗎?僅用數字存儲電話號碼,用「x」表示分機號碼?

CREATE Function [dbo].[RemoveAlphaCharacters](@Temp VarChar(1000)) 
Returns VarChar(1000) 
AS 
Begin 

    While PatIndex('%[^0-9,x,X]%', @Temp) > 0 
     Set @Temp = Stuff(@Temp, PatIndex('%[^0-9,x,X]%', @Temp), 1, '') 

    Return @TEmp 
End 
+1

'VARCHAR(1000)'一個電話號碼?這是覆蓋星系還是地球? – 2012-03-13 19:51:39

+0

@Aaron Yea,剛剛用這個功能測試不要拍我。 – Vishal 2012-03-13 19:54:54

+0

沒有拍攝,只是問。 :-) – 2012-03-13 19:56:12

回答

2

PATINDEX這裏的問題是,它不能真正確定它命中的第一次之後的字符串的模式應該改變。因此,也許這種方法會更簡單:

CREATE FUNCTION [dbo].[RemoveAlphaCharacters] 
(
    @Temp VARCHAR(1000) 
) 
RETURNS VARCHAR(1000) 
AS 
BEGIN 
    DECLARE @i INT, @hitX BIT, @t VARCHAR(1000), @c CHAR(1); 

    SELECT @i = 1, @hitX = 0, @t = ''; 

    WHILE @i <= LEN(@Temp) 
    BEGIN 
     SET @c = SUBSTRING(@Temp, @i, 1); 
     IF LOWER(@c) = 'x' AND @hitX = 0 
     BEGIN 
      SET @t = @t + @c; 
      SET @hitX = 1; 
     END 
     IF @c LIKE '[0-9]' 
     BEGIN 
      SET @t = @t + @c; 
     END 

     SET @i = @i + 1; 
    END 
    RETURN(@t); 
END 
GO 

SELECT dbo.RemoveAlphaCharacters('401-867-9092'); 
SELECT dbo.RemoveAlphaCharacters('401-867-9092x32'); 
SELECT dbo.RemoveAlphaCharacters('401-867-9092x32x54'); 

結果:

4018679092 
4018679092x32 
4018679092x3254 
+0

謝謝,這很好! – Vishal 2012-03-13 20:01:58