2010-12-18 14 views
0

私は "MachineModel"データベースのカスタマイズされた検索を有効にするためにいくつかの既定値を持つ単純なストアドプロシージャを作成しました。SQL Server Express 2008 R2 - テキストフィールドの角括弧は結果を返しません

Model.[ModelName] LIKE '%' + ISNULL(@ModelName, Model.[ModelName]) + '%' 

部分一致を可能にする必要があります

は、WHERE句の一部として、私はこのようなものを持っています。しかし、これは大半のモデルで有効ですが、@ ModelNameに値が指定されていない場合、ISNULLはModel。[ModelName]に解決され、基礎となるフィールドデータには "Lenny's Test Model [2010]"などの角括弧が含まれます。これらのレコードレコードはSProcによって返されません。

これは大きな問題ではありませんが、実際には4つのモデル(約120,000)の名前に角括弧が含まれているため、簡単に変更することができますが、何が起こっているのか、これを解決する。

乾杯、

レニー。 % _ [は:

答えて

1

は、なぜあなたはヌル検索パラメータの場合には、それ自体でモデルを比較していますか?これは高価です。

また、その高価なとしてSQL Serverとの論理積と論理和を混在させる素晴らしい練習ではなく、行うことができる:

Where (
@ModelName is null OR 
(ModelName is not null AND ModelName LIKE '%' + @ModelName + '%') 
) 

パフォーマンスを助けることができるならば、導入、PROBことができれば、あなた複製終わるんあなたの選択

if @ModelName is null 
select * from ... 
else 
select ... 
where ModelName LIKE '%' + @ModelName + '%' 

あなたはできるが、それは、あなたのDBAを混乱させるコードと使用sqlparametersでSQLを構築し、このvarはそのための

+0

返信ありがとうございます - 私は、ちょうど約重複した選択を持って、私が住むことができるようにIfステートメントに行きました。ちなみに、モデルとの比較が高価だと言うと、このアプローチはより良いでしょうかhttp://weblogs.asp.net/rmclaws/archive/2004/02/18/75381.aspx? –

+0

isnullソリューションを試しましたか?このような簡単なクエリの場合、比較は簡単で無視されます。試してみてください... – gbn

+0

@Leonard - これは1つまたは2つの述語では問題ありません。値がオプションでORが導入され、大きなレコードセットと適切な負荷がある場合は、パフォーマンスの問題が発生します。検索/フィルタフォームの場合は、sqlをコードで構築する方が良いかもしれません(SQLインジェクションを防ぐためにsqlパラメタを使用します)。 –

3

あなたが意味を持つ3つの文字がLIKEであり[[]

でリードブラケットを交換する必要があります。末尾の括弧をエスケープする必要はありません。完全のために

Model.[ModelName] LIKE '%' + ISNULL(
    --don't do it the other way around! 
    REPLACE(REPLACE(REPLACE(@ModelName, '[', '[[]), '%', '[%]), '_', '[_]), 
    Model.[ModelName]) + '%' 
+0

おかげnullでない場合にのみ場所を追加します - それは私のためにこの問題をかなり解決しませんでしたが、別の問題を解決しました! –

関連する問題