我需要一个适用于所有可打印特殊字符的模式。该模式将用于过滤字符串。
DECLARE @String NVARCHAR(256) = 'te@st%$#&' -- 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
- 电流
- 输入:' te @ st%$#&'
- 输出:' @%$#'
- 期望的
- 输入:' te @ st%$#&'
- 输出:' @%$#&'
- 输入:' te @ st%$#`~DAS!%^ 789 *()€'
- 输出:' @%$#`〜!%^ *()'
由于
答案 0 :(得分: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) + ...