SQL Patindex模式用于过滤



我正在尝试过滤一个用作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

在上面显示的数据中,您可以将其解释为:当您在上面的代码中所显示的分组时,第一个字符将被第二个字符替换为第二个字符。

相关内容

  • 没有找到相关文章

最新更新