2016-06-09 76 views
2

我需要所有可打印特殊字符的圖案。該模式將用於過濾字符串。適用於所有可打印特殊字符的圖案

DECLARE @String NVARCHAR(256) = '[email protected]%$#&' -- input 

-- patern for all printable special characters 
-- ASCII 33-47, 58-64, 91-96 and 123-126 
DECLARE @Pattern NVARCHAR(256)= '%[^ @%$#]%' 



WHILE PATINDEX(@Pattern, @String) > 0 
SET @String = STUFF(@String, PATINDEX(@Pattern, @String), 1, '') 

SELECT @String 

--current

- 輸入: '忒@ ST%$#&'
- 輸出: '@%$#'

--desired

- input:'te @ st%$#&'
- output:'@%$#&'

- 輸入: '忒@ ST%$#`〜DAS%^ * 789()€!'
- 輸出: '!@%$#`〜%^ *()'

感謝

回答

0

雖然不與圖案純解決方案,您可以與用戶定義的函數做到這一點:

CREATE FUNCTION dbo.RemoveNonDisplayChars(@pString VARCHAR(8000)) 
RETURNS VARCHAR(8000) AS BEGIN 
DECLARE @IncorrectCharLoc SMALLINT, --Position of bad character 
     @Pattern   VARCHAR(128) --Bad characters to look for 

SELECT @Pattern   = '%[' 
          + CHAR(0)+CHAR(1)+CHAR(2)+CHAR(3)+CHAR(4) 
          + CHAR(5)+CHAR(6)+CHAR(7)+CHAR(8)+CHAR(9) 
          + CHAR(10)+CHAR(11)+CHAR(12)+CHAR(13)+CHAR(14) 
          + CHAR(15)+CHAR(16)+CHAR(17)+CHAR(18)+CHAR(19) 
          + CHAR(20)+CHAR(21)+CHAR(22)+CHAR(23)+CHAR(24) 
          + CHAR(25)+CHAR(26)+CHAR(27)+CHAR(28)+CHAR(29) 
          + CHAR(30)+CHAR(31)+CHAR(127) 
          + ']%', 
     @IncorrectCharLoc = PATINDEX(@Pattern, @pString) 

    WHILE @IncorrectCharLoc > 0 
SELECT @pString   = STUFF(@pString, @IncorrectCharLoc, 1, ''), 
     @IncorrectCharLoc = PATINDEX(@Pattern, @pString) 
RETURN @pString 
END 
此鏈接

更多信息:Remove non printable characters

如果要刪除所有的字母,與啓動模式:'%[a-z,A-Z,' + CHAR(0) + ...