83

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

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

declare @myString NVARCHAR(100);

そして、私はそれを式で使用したいLIKE:

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

この方法で安全に使用できるように、T-SQL で文字列 (より具体的には、LIKEパターン マッチングにとって意味のある文字、たとえば%や)をエスケープするにはどうすればよいですか??

たとえば、次のようになります。

@myString = 'aa%bb'

私が欲しい:

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

に一致'aa%bb'しますが、 orには一致し'caa%bbc'ません。'aaxbb''caaxbb'

4

6 に答える 6

101

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

たとえば、これはエスケープ文字として\を使用して、%記号をエスケープします。

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変数は文字列を置き換えると長くなるため、より多くのスペースを割り当てることを忘れないでください。

于 2008-11-03T15:13:30.130 に答える
19

同様の問題があり(NHibernateを使用しているため、ESCAPEキーワードは非常に困難でした)、ブラケット文字を使用して解決しました。だからあなたのサンプルは

WHERE ... LIKE '%aa[%]bb%'

証拠が必要な場合:

create table test (field nvarchar(100))
go
insert test values ('abcdef%hijklm')
insert test values ('abcdefghijklm')
go
select * from test where field like 'abcdef[%]hijklm'
go
于 2009-07-24T15:24:06.293 に答える
15

パターンで先頭のワイルドカードを使用している場合、パターン構文で特に重要な文字列内のすべての文字をエスケープするのではなく、実行するだけですばやく簡単になります。

SELECT * 
FROM YourTable
WHERE CHARINDEX(@myString , YourColumn) > 0

先頭のワイルドカードを使用していない場合は、上記のアプローチは避けてください。ただし、でインデックスを使用することはできませんYourColumn

さらに、一致する行の数に応じて最適な実行プランが異なる場合は、角かっこを使用したエスケープ構文を両方キーワードLIKEと比較して使用すると、見積もりが改善される可能性があります。CHARINDEXESCAPE

于 2012-02-11T16:56:44.283 に答える
4

エスケープ文字を指定します。ドキュメントはこちら:
http://msdn.microsoft.com/en-us/library/ms179859.aspx

于 2008-11-03T14:26:39.990 に答える
3

エスケープ文字を含む文字列を探しますか? たとえば、これが必要です:

select * from table where myfield like '%10%%'.

10% のすべてのフィールドをどこで検索しますか? その場合は、ESCAPE 句を使用してエスケープ文字を指定し、ワイルドカード文字をエスケープできます。

select * from table where myfield like '%10!%%' ESCAPE '!'
于 2008-11-03T14:35:39.347 に答える