2012-01-30 3 views
1

動的SQLを使用しないで、IfELSE以外の場合は、表にフル・テキスト索引があるかどうかをテストする手段があります。全文索引なしの表のCONTAINSを使用した問合せ

私は、私はまだ実行することができますいくつかの方法を探しています:

SELECT * FROM Cars WHERE <not has full text index> OR (<has full text index> AND CONTAINS(*, 'fast')) 

テーブルCarsこのには、フルテキストインデックスは、それだけですべての行を返すようにするために、我々がしようとすると、理想的に私は希望はありませんcontains文字列を指定します。

私は現在、SQLから持っていることは次のとおりです。

罰金解析したがために失敗した
SELECT * FROM Cars 
WHERE NOT EXISTS (SELECT 1 FROM sys.columns WHERE object_id = object_id('Cars') AND COLUMNPROPERTY(object_id, name, 'IsFulltextIndexed') = 1) 
OR (EXISTS (SELECT 1 FROM sys.columns WHERE object_id = object_id('Cars') AND COLUMNPROPERTY(object_id, name, 'IsFulltextIndexed') = 1) 
AND CONTAINS(*, 'fast')) 

メッセージ7601、レベル16、状態1、行3は、CONTAINSまたはFREETEXT を使用することはできません索引付けされたビュー「索引付けされたビュー」の述語はフルテキストではないため、 索引付けされています。

動的SQLを使用せずに、IFELSEを使用しないでこれを行う方法はありますか?

オプティマイザが1 = 0とCONTAINSを短絡しない理由を説明できる場合は、SELECT * FROM Cars WHERE 1=1 OR (1=0 AND CONTAINS(*, 'fast'))のボーナスポイントです。

実際には、新しいクラス属性を作成し、それを使用してORMのフルテキストインデックスを無視しますが、別のオプションがあるかどうかを確認することに興味があります。

答えて

0

すべて単一のクエリは、単一の計画にコンパイルされ、そしてそのすべての個々のコンポーネントは常に有効でなければなりません。さまざまな状況で異なるコンポーネントが有効である単一のステートメントを記述することはできません。

このようにするには、より伝統的なプログラム構造が必要です。これらはT-SQLでは使用できますが、単一のSQL文では使用できません。そのようなものとして、あなたが無害であると列挙した解決策は、実際にそのような問題を解決する方法です。

+0

オプティマイザが条件を短絡させない理由については、簡単な答えは、実行計画を立てるときにSQL Serverが短絡しないことです。実行時に特定の条件を評価することはできませんが(ただし、動作は短絡とは異なります)、コンパイル時にすべてのコンポーネントが有効であるとチェックされます。 – MatBailie

+0

http://weblogs.sqlteam.com/mladenp/archive/2008/02/25/How-SQL-Server-short-circuits-WHERE-condition-evaluation.aspx – MatBailie

関連する問題