1

ストアド プロシージャを使用してデータベース (SQL Server 2008) を検索します。ユーザーはテキスト ボックスにキーワードを入力できます (たとえば、キーワードを使用,して区切ることができます)。

現在、私は次のようなものを使用しています:

keyword like N"%'+@SearchQuery%'%"

(keywordnvarcharテーブル内の列であり@SearchQuery、ストアド プロシージャへの入力です)

問題なく動作しますが、ユーザーがいくつかのキーワードを入力するとどうなりますか: リンゴ、オレンジ、バナナ

キーワードの数を制限する必要がありますか? 複数のキーワードがある場合、ストアド プロシージャはどのように記述すればよいですか? ユーザー入力をストアド プロシージャに渡すにはどうすればよいですか? フレーズ全体として渡しapple, orange, bananaてから、ストアド プロシージャでそれらを解析する必要がありますか、それともキーワードを分離して 3 つのキーワードを送信する必要がありますか? これら 3 つのキーワードを照会するにはどうすればよいですか? forループ?

このようなクエリを実行するためのベスト プラクティスは何ですか?

ありがとう

4

3 に答える 3

5

アプリケーションのキーワードの解析を行います。SQLは文字列操作に最適な場所ではありません。

キーワードをテーブル値パラメーターとして送信します(例:http : //www.mssqltips.com/sqlservertip/2112/table-value-parameters-in-sql-server-2008-and-net-c/)。 t固定数のキーワードに制限されます。

ストアドプロシージャのパラメータにワイルドカードを追加します

update @keywords set keyword = '%'+keyword+'%'

ソースデータをこのテーブルに結合して結果をフィルタリングする

例えば:

SELECT result
FROM source 
    INNER JOIN @keywords keywords 
         ON source.keyword LIKE keywords.keyword
于 2012-07-27T08:51:47.353 に答える
2

* データベースの大きさ。* ユーザーが何かを検索する頻度。* 正確な結果のユーザーを除きます。

LIKEはパフォーマンス デーモンではありません。特に%.

多分あなたは完全な検索テキストを試してみるべきですか?

一緒にいたい場合LIKE(小さなテーブルでのみ機能します)、次のようなものを試します:

  1. 入力を文字ごとに分割します ( podiluska,が提案したようにテーブルに挿入することをお勧めします)。
  2. 各トークンとUNIONすべての結果に対してクエリを作成します。または、トークンごとにループで実行し、結果を一時テーブルに挿入します。

正確な結果が必要な場合 (つまり、レコードのみが 3 つの単語すべてに一致する場合)、上記で作成した一時的な結果から最も一致する結果を選択できます。

于 2012-07-27T08:53:33.127 に答える
1

CTE を使用して、キーワードの文字列を一時テーブルに分割し、好きなように使用できます。キーワード リストには、数字や %$<> などの任意の文字を含めることもできます。コンマは文字列の区切り記号であることを覚えておいてください。

DECLARE @CommaSeparatorString VARCHAR(MAX),
        @CommaSeparatorXML XML
DECLARE @handle INT
SELECT @CommaSeparatorString = 'apple,orange,banana'
SELECT @CommaSeparatorString = REPLACE(REPLACE(@CommaSeparatorString,'<','$^%'),'>','%^$')
SELECT @CommaSeparatorXML   =   CAST('<ROOT><i>' + REPLACE(@CommaSeparatorString, ',', '</i><i>') + '</i></ROOT>' AS XML) 

SELECT REPLACE(REPLACE(c.value('.', 'VARCHAR(100)'),'$^%','<'),'%^$','>') AS ID
  FROM (SELECT @CommaSeparatorXML AS CommaXML) a
 CROSS APPLY CommaXML.nodes('//i') x(c)

結果:

  ID
------
apple
orange
banana
于 2012-07-27T09:01:17.370 に答える