動的SQLを使用しないで、If
ELSE
以外の場合は、表にフル・テキスト索引があるかどうかをテストする手段があります。全文索引なしの表の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を使用せずに、IF
ELSE
を使用しないでこれを行う方法はありますか?
オプティマイザが1 = 0とCONTAINSを短絡しない理由を説明できる場合は、SELECT * FROM Cars WHERE 1=1 OR (1=0 AND CONTAINS(*, 'fast'))
のボーナスポイントです。
実際には、新しいクラス属性を作成し、それを使用してORMのフルテキストインデックスを無視しますが、別のオプションがあるかどうかを確認することに興味があります。
オプティマイザが条件を短絡させない理由については、簡単な答えは、実行計画を立てるときにSQL Serverが短絡しないことです。実行時に特定の条件を評価することはできませんが(ただし、動作は短絡とは異なります)、コンパイル時にすべてのコンポーネントが有効であるとチェックされます。 – MatBailie
http://weblogs.sqlteam.com/mladenp/archive/2008/02/25/How-SQL-Server-short-circuits-WHERE-condition-evaluation.aspx – MatBailie