我正在尝试过滤一个用作Outlook Mail主题行的字符串。我使用过滤器b/c一些具有特殊字符的字符串会将主题行转换为我想预防的Unicode。我正在尝试使用patindex,但无法将括号置于模式中,有人知道如何做到这一点和/或有一个很好的网站,可以分享为Patindex创建模式的指南。这是我拥有的:
-- First replaces special characters with similar safe ones.
-- Finally excludes all other characters not specified in the pattern.
-- =============================================
ALTER Function [dbo].[RemoveSpecialCharacters](@Temp VarChar(1000))
Returns VarChar(1000)
AS
BEGIN
DECLARE @KeepValues as varchar(50)
SET @Temp = Replace(Replace(Replace(Replace(Replace(Replace(Replace(@Temp,'”','"'),'“','"'),'‘','`'),'’','`'),'–','-'),'[','('),']',')')
SET @KeepValues = '%[^a-z0-9()."`:;,#&+*/-]%'
WHILE PatIndex(@KeepValues, @Temp) > 0
SET @Temp = Stuff(@Temp, PatIndex(@KeepValues, @Temp), 1, '')
RETURN @Temp
END
您可以看到,因为我无法弄清楚如何在模式中获得括号,因为现在我用括号替换它们。
SET @KeepValues = '%[^a-z0-9()."`:;,#&+*/-[]][[]]%'
左括号= [[]右括号= []]
编辑:
下面避免了Patindex完全完成同一件事。让我知道它是否适合您。
DECLARE @input VARCHAR(1000) = 'th,is i[s @a] [[.[ te[ st '
, @Temp VARCHAR(1000) = ''
, @index INT = 1
, @char CHAR(1);
WHILE @index <= LEN(@input)
BEGIN
SET @char = SUBSTRING(@input, @index, 1);
IF @char LIKE '[a-z0-9()."`:;,#&+*/-]' OR @char = '[' OR @char = ']'
SET @temp += @char;
SET @index += 1;
END;
PRINT @Temp;
- 首先用类似的安全角色代替特殊字符。
似乎您想用常规报价替换打开报价,用常规报价等关闭报价等...您可以使用一个技巧来做到这一点,而无需一堆替代品。我不假装知道有关碰撞的一切,但我确实知道他们可以做一些您不期望的非常奇怪的事情,有时您可以利用它来发挥自己的优势。
例如:
Declare @Temp VarChar(100)
SET @Temp = '”“‘’–'
Select @Temp,
@Temp Collate SQL_Latin1_General_Cp850_CI_AS
运行上面的代码时,您会看到数据类型为varchar。我们设置了一个带有打开报价,关闭报价等的字符串...如果您不指定整理,则SQL将使用默认数据库汇编返回数据。如果您确实指定了整理,则SQL将使用Collation返回数据。
您可以看到,实际上要替换为"安全"特殊字符的所有特殊字符。
将其全部拉在一起:
Alter Function [dbo].[RemoveSpecialCharacters](@Temp VarChar(1000))
Returns VarChar(1000)
AS
BEGIN
DECLARE @KeepValues as varchar(50)
SET @Temp = @Temp Collate SQL_Latin1_General_Cp850_CI_AS
SET @KeepValues = '%[^a-z0-9()."`'':;,#&+*/-[[][]]]%'
WHILE PatIndex(@KeepValues, @Temp) > 0
SET @Temp = Stuff(@Temp, PatIndex(@KeepValues, @Temp), 1, '')
RETURN @Temp Collate Database_Default
END
请注意,在功能中,数据将转换为不同的整理,返回值将其转换回数据库的默认排列。
我还将开放式正方形支架放在keepvalues中。
使用替换功能不一定不好,但是转换collations的执行速度将更快,并且会产生相同的结果。标量功能是臭名昭著的绩效杀手,因此使它们尽可能快地使其最大的利益(您应该对此功能的性能感到满意)。
现在...我之前说过,我不知道有关碰撞的一切,所以可能会出乎意料。大多数字符都是相同的,但是有一些区别:
€ ?
?
‚ '
ƒ ƒ
„ "
… .
† ┼
‡ ╬
ˆ ^
‰ %
Š S
‹ <
Œ O
?
Ž Z
?
?
‘ '
’ '
“ "
” "
•
– -
— -
˜ ~
™ T
š s
› >
œ o
?
ž z
Ÿ Y
在上面显示的数据中,您可以将其解释为:当您在上面的代码中所显示的分组时,第一个字符将被第二个字符替换为第二个字符。