14

@文字列をリテラルと見なすc#の記号に似たSQLServerで機能するものを探しています。例えば:

string text = "abcd\\efg";
Output of text = abcd\efg

string text = @"abcd\\efg";
Output of text = abcd\\efg

@が文字列にどのように影響し、すべての文字をそのまま使用するかに注意してください。

これが可能かどうかはわかりませんが、これが私の問題であり、これを解決するためのより良い方法があるかもしれません。次の基本的なクエリについて考えてみます。

SELECT [Name] 
  FROM [Test] 
 WHERE [Name] LIKE (@searchText + '%')

私の問題は、彼らが私のlike句に影響を与える可能性のある%_またはその他の特殊文字を入れているかどうかです。'startswith'関数のように一致を機能させたい。それで、@ searchTextに適用して、これを文字通りに解釈できるものはありますか、それとも私が考えていないより良い解決策があるのでしょうか?

編集:私は解決策がクライアント側のクリーニングになることを望んでいません。クリーンアップで渡されるデータに依存せずに動作するには、このストアドプロシージャが必要です。

4

7 に答える 7

23

文字列内のワイルドカードではなくリテラルとして「%」を検索するには、[%]としてエスケープする必要があります。

現在、SQL Serverは3文字のエスケープのみを必要とします:%_ [

したがって、これをラップするスカラーudfを作成します。

REPLACE(REPLACE(REPLACE(@myString, '[', '[[]'), '_', '[_]'), '%', '[%]')

SQLでの単純な(別名:非常に限定された)パターンマッチングのため、これ以上複雑なものは必要ありません...

于 2009-09-15T17:21:36.033 に答える
9

TSQLでは、%文字と_文字を角かっこで囲むことができます。[%] [_]これにより、SQLはそれらをリテラルとして扱うようになります。

これがSQLServer7.0、2000、および2005で機能することをテストおよび検証しました。

http://msdn.microsoft.com/en-us/library/aa933232(SQL.80).aspx

于 2009-09-15T16:34:37.517 に答える
0

クエリをパラメータ化する場合、それについて心配する必要はありません。

アップデート

コメントで再帰的に述べられているように、パラメーター化されたクエリでも%をエスケープする必要があります。テストしたときに、linqtosqlが自動的にそれを実行していることに気づきませんでした。

ESCAPE'x'を使用できます。ここで、xはエスケープ文字にしたい文字です。Linq to SQLは、このようにします

WHERE[名前]LIKE@searchText ESCAPE'〜'

ここで、@ searchText = [〜%文字%のテキスト]

または他の人が述べているように、[%]でエスケープできます

ドキュメントを見る

于 2009-09-15T16:42:59.123 に答える
0

文字通りに扱われる各文字は、角括弧で囲む必要があります。右角かっこは文字通り直接使用されるため、角かっこを囲まないでください。

于 2009-09-15T16:29:04.907 に答える
-1

ドキュメントから:

構文

match_expression [NOT]LIKEパターン [ ESCAPEEscape_character ]

ESCAPE次のようなオプションを使用します。

SELECT [Name] 
  FROM [Test] 
 WHERE [Name] LIKE (REPLACE(@searchText, '%', '%%') + '%') ESCAPE '%'
于 2009-09-15T16:44:54.360 に答える
-1

これを回避するためにSQLで厄介なことをしようとするのではなく、フロントエンドアプリケーションで文字列をサニタイズします。

于 2009-09-15T16:31:50.767 に答える
-1

受信テキストを変更したくない場合は、「LEFT」機能を使用して独自の「STARTSWITH」を作成できます。

SELECT [Name] 
  FROM [Test] 
 WHERE @searchText = LEFT( [Name], LEN( @searchText ) )

(NULLまたは空の文字列の場合を処理するには、おそらく追加の作業が必要になることに注意してください。)

編集:「LIKE」を使用して「%」を検索することに関する誤ったステートメントを削除しました。

于 2009-09-15T16:39:20.690 に答える