2

Outlook メールの件名として使用する文字列をフィルター処理しようとしています。フィルタ 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

ご覧のとおり、パターンで括弧を取得する方法がわからなかったので、今のところ括弧に置き換えています。

4

2 に答える 2

0

-- 最初に、特殊文字を同様の安全なものに置き換えます。

開いた引用符を通常の引用符に、閉じた引用符を通常の引用符に置き換えたいかのように見えます...たくさんの置き換えをいじらずにこれを行うために使用できるトリックがあります。照合について知っておくべきことをすべて知っているふりをしているわけではありませんが、照合が予想外の非常に奇妙なことを実行できることは知っています。

例えば:

Declare @Temp VarChar(100)
SET @Temp = '”“‘’–'
Select @Temp,
        @Temp Collate SQL_Latin1_General_Cp850_CI_AS

上記のコードを実行すると、データ型が varchar であることがわかります。開始引用符、終了引用符などで文字列を設定します。照合を指定しない場合、SQL はデフォルトのデータベース照合を使用してデータを返します。照合を指定すると、SQL は照合を使用してデータを返します。

ご覧のとおり、「安全な」特殊文字に置き換えたい特殊文字はすべて実際に置き換えられています。

これをすべてまとめると:

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 に入れます。

replace 関数を使用することは必ずしも悪いことではありませんが、照合順序を変換すると実行が速くなり、同じ結果が得られます。スカラー関数はパフォーマンス キラーとして悪名高いので、可能な限り高速にすることが最大の関心事です (そして、この関数のパフォーマンスに満足する必要があります)。

さて... 先ほど、照合について知っておくべきことがすべてわかっているわけではないと言いました。そのため、予期しないことがあるかもしれません。ほとんどのキャラクターは同じですが、いくつかの違いがあります。

€    ?
    ?
‚    '
ƒ    ƒ
„    "
…    .
†    ┼
‡    ╬
ˆ    ^
‰    %
Š    S
‹    <
Œ    O
    ?
Ž    Z
    ?
    ?
‘    '
’    '
“    "
”    "
•    
–    -
—    -
˜    ~
™    T
š    s
›    >
œ    o
    ?
ž    z
Ÿ    Y

上記のデータを使用すると、これを次のように解釈できます。上記のコードで示したように、照合順序を変換すると、最初の文字が 2 番目の文字に置き換えられます。

于 2014-03-07T16:28:36.937 に答える
0
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;
于 2014-03-07T14:30:55.843 に答える