2016-01-13 57 views

回答

3

此:

PatIndex('%[^a-zA-Z0-9+&@#\/%=~_|$?!-:,.']%', YourValue) 

將返回與模式匹配在該字符。在這種情況下,我已將^添加到開頭,以便模式匹配字符集中的所有而不是

然後,您可以刪除該位置處的字符,並繼續或替換整個字符串中找到的字符的所有匹配項。

FYI:模擬,以搜索開始在某個字符位置,你可以使用Substring得到的字符串(甚至是一個字符)的一部分,並使用對PatIndexCharIndexoffset參數。

+0

所以使用這個我將不得不包裝在一個while循環來考慮sce nario哪裏有一個以上的無效字符可以在字符串中正確? – rmon2852

+0

正確。沒有辦法獲得某種與模式不匹配的字符列表的地圖。你一次能找出一個。 – ErikE

0

由於ErikE在他的回答中提到,PATINDEX方法是你所需要的,它是SLOW不過。

關於SO的一個非常類似的問題的答案是stackoverflow.com/a/23001916/4316831。下面的代碼從那裏被送往:

DECLARE @counter int 

SET @counter = 0 

WHILE(@counter < (SELECT MAX(ID_COLUMN) FROM Table)) 
BEGIN 

    WHILE 1 = 1 
    BEGIN 
     DECLARE @RetVal varchar(50) 

     SET @RetVal = (SELECT Column = STUFF(Column, PATINDEX('%[^0-9.]%', Column),1, '') 
     FROM Table 
     WHERE ID_COLUMN = @counter) 

     IF(@RetVal IS NOT NULL)  
      UPDATE Table SET 
      Column = @RetVal 
      WHERE ID_COLUMN = @counter 
     ELSE 
      break 
    END 

    SET @counter = @counter + 1 
END 
+0

這不僅僅是一個只有鏈接的答案,這是不滿意的。你能稍微擴展一下嗎? – ErikE

+0

好大聲@ErikE,我不確定粘貼別人的代碼塊的禮儀,但我想如果我正確地相信它沒關係。 –

+0

現在我想到了,也許最好將這個問題標記爲該問題的副本,而不是僅僅重複答案...? – ErikE

2

好吧基於ErikE的幫助下,我做了以下功能

 CREATE FUNCTION dbo.RemoveInvalidCharacters 
(
@pattern as varchar(max), 
@string as varchar(max) 
) 
RETURNS varchar(MAX) 
AS 
BEGIN 

    WHILE PatIndex(@pattern,@string) >0 
     BEGIN 
     SET @string=REPLACE(@string,SUBSTRING(@string,PatIndex(@pattern,@string),1),'') 
END 
RETURN @String 

END 
GO 

然後,所有我能做的就是調用該函數爲:

select dbo.RemoveInvalidCharacters('%[^a-zA-Z0-9+&@#\/%=~_|$?!:,.''-]%','Test€€€String^^^') 

然後輸出是: TestString

+0

同意,我已更正。享受代表 – rmon2852