1. ホーム
  2. sql-server

[解決済み] SQL Serverで文字列をエスケープし、LIKE式で安全に使用できるようにする。

2023-06-21 02:12:10

質問

SQL Server のストアド プロシージャで文字列をエスケープするにはどうすればよいですか。 LIKE 式で安全に使用できます。

仮に NVARCHAR のような変数があるとします。

declare @myString NVARCHAR(100);

で使いたいのですが LIKE の式で使いたい。

... WHERE ... LIKE '%' + @myString + '%';

文字列をどのようにエスケープすればよいのでしょうか(具体的には、意味する文字が LIKE のようなパターンマッチを行う場合、例えば % または ? を含む)をT-SQLで使用することは安全でしょうか?

例えば、与えられた

@myString = 'aa%bb'

欲しい

WHERE ... LIKE '%' + @somehowEscapedMyString + '%'

にマッチするように 'aa%bb' , 'caa%bbc' ではなく 'aaxbb' または 'caaxbb' .

どのように解決するのですか?

LIKE 式の中で特殊文字をエスケープするには、その前にエスケープ文字を付けます。どのエスケープ文字を使用するかは ESCAPE キーワードで選択できます。( MSDN 参照 )

例えば、これは%記号をエスケープするもので、エスケープ文字として "the \"を使用します。

select * from table where myfield like '%15\% off%' ESCAPE '\'

どのような文字が文字列に含まれるかわからず、ワイルドカードとして扱いたくない場合は、すべてのワイルドカード文字の前にエスケープ文字を付けることができます(例.

set @myString = replace( 
                replace( 
                replace( 
                replace( @myString
                ,    '\', '\\' )
                ,    '%', '\%' )
                ,    '_', '\_' )
                ,    '[', '\[' )

(エスケープ文字もエスケープしなければならないことに注意し、それが内側の replace から追加されたものをエスケープしないように、内側の replace ステートメントから追加されたものをエスケープしないように)。そうすると、次のようなものが使えるようになります。

select * from table where myfield like '%' + @myString + '%' ESCAPE '\'

また、@myString変数は文字列の置換によって長くなるので、より多くのスペースを確保することを忘れないでください。