2

私はかなり複雑なクエリを持っていて、好きな用語を修正していました (別の db テーブルとして持っていて、それらを検索クエリにロードします) が、それをパラメータ化すると、クエリは異なる結果を返します。

したがって、古いクエリには次のような like セクションがありました。

((v.title = ''BA'') OR (vs.label = ''BA'') OR 
(v.title LIKE ''BA %'') OR (vs.label LIKE ''BA %''))
...

そして、私はそれを次のようなものに置き換えました(パラメータ付き):

((v.title = @banone) OR (vs.label = @banone) OR 
(v.title LIKE @baright) OR (vs.label LIKE @baright))
...
@banone=N'BA',@baright=N'BA %',
...

私のパラメータは次のように追加されます:

string key = "ba"; 
string val = "ba";

parameters.Add("@" + key + "none", val);
parameters.Add("@" + key + "right",  val + " %");

これら 2 つのクエリは同じですか? 何か不足していますか?

4

2 に答える 2

2
(
  (v.title = @banone) OR (vs.label = @banone) OR 
  (v.title LIKE @banone + ' %') OR (vs.label LIKE @banone + ' %')
)
...
@banone=N'BA'
...
于 2013-01-03T01:25:27.977 に答える
1

最初の 2 つまたはケースは存在する理由がありません。LIKE ケースのみを使用すると、同じレコードが取得されます。例えば:

(v.title LIKE @banone + ' %') OR (vs.label LIKE @banone + ' %')

どこで @banone='BA'


パラメータを追加するコードが正しくないと思います。

これparameters.Add("@" + key + "right", val + " %");

する必要がありますparameters.AddWithValue("@" + key +"right", val + "%");

注意すべき点が 2 つあります。まず、パーセント記号の直前のスペースを削除しました。次に、単純な Add の代わりに AddWithValue を使用しています。

あなたに返される質問は、そのスペースが重要だったかどうかです。元のクエリを振り返ってみると、たとえばタイトルの値がBATtitle = 'BA' or title LIKE 'BA %'の場合は実際には無視されますが、 BAのようなタイトルは取得されます。

作業中のデータと受け取った結果を投稿することをお勧めします。

于 2013-01-03T01:32:02.980 に答える