2015-10-14 73 views
0

我需要清理表中可能被頭部污染的字符串。不需要的字符將以多個字符顯示,而有效字符之間可能會出現一些常見字符,而有效字符串以[0-9a-zA-Z],\[\]和下劃線開頭,但可能包含其他字符,如#@ This_is_.a_[cat]^,' __process_'data'#。如何識別我的有效字符串的開始位置?如何識別可能是字母或下劃線的字符位置

WHILE LEN(@str) > 1 IF PATINDEX([0-9a-zA-Z\[\]_]%, @str) = 0 @str = SUBSTRING(@str,2,999) ELSE --find valid head

或類似PATINDEX([0-9a-zA-Z\[\]_]% ESCAPE _, @str)的方式,

PATINDEX([0-9a-zA-Z\[\]_]% ESCAPE [_], @str)

PATINDEX([0-9a-zA-Z\[\][_]]%, @str)

不起作用(PATINDEX總是= 0)。

+0

你可以添加一些例子:輸入字符串和清洗後的預期值? –

+0

@Julien Vavasseur例如'__process_'data'#'作爲'__process_'data'#','。 $$ @@#123_456'應該變成'123_456' – a4194304

回答

0

我不知道函數PATINDEX,但如果你檢查每個字符CHARINDEX,直到你找到一個允許在字符串開頭的字符,它應該工作。試試這個例子:

DECLARE @Str nvarchar(50) = N'"§$"!This is your text or column or whatever'; 
DECLARE @AllowStart nvarchar(100) = N'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ[]_'; -- All characters which are allowed at the beginning 
DECLARE @Index int = 1; 
WHILE @Index <= LEN(@Str) 
BEGIN 
    IF CHARINDEX(SUBSTRING(@Str, @Index, 1), @AllowStart) > 0 -- Test if character at position @Index is part of @AllowStart 
     BREAK; 

    SET @Index += 1; 
END 

SET @Str = SUBSTRING(@Str, @Index, 100); 
+0

那麼,使用'CHARINDEX'通過'反向'解決這個問題非常棒! – a4194304

+0

你不需要@ EndLoop。它可以被Break取代。 SET @ Str = SUBSTRING可以在循環之外完成。 –

+0

這是一個好主意。我編輯了我的答案。 – Dorian

相關問題