【发布时间】:2012-02-22 05:04:14
【问题描述】:
在不使用动态 SQL 的情况下,除了 If ELSE 之外,还有什么方法可以测试表是否具有全文索引而不会导致额外的锁定。
我正在寻找一些我仍然可以执行的方法:
SELECT * FROM Cars WHERE <not has full text index> OR (<has full text index> AND CONTAINS(*, 'fast'))
此表Cars 上没有全文索引,理想情况下,我希望它在我们尝试指定包含字符串时仅返回所有行。
我目前从 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 的情况下做到这一点?
如果您能解释为什么优化器不会短路 SELECT * FROM Cars WHERE 1=1 OR (1=0 AND CONTAINS(*, 'fast')) 中的 1=0 和 CONTAINS,则可以加分。
在实践中,我可能会创建一个新的类属性,然后使用它来忽略我的 ORM 中的全文索引,但我很想看看是否还有其他选项。
【问题讨论】:
标签: sql sql-server full-text-search