不使用动态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'))
解析得很好但失败了因为:
Msg 7601,Level 16,State 1,Line 3不能使用CONTAINS或FREETEXT 表或索引视图'Cars'上的谓词,因为它不是全文 索引。
有没有办法在没有动态SQL且不使用IF
ELSE
的情况下执行此操作?
如果你可以解释为什么优化器不会使{0}与SELECT * FROM Cars WHERE 1=1 OR (1=0 AND CONTAINS(*, 'fast'))
中的1 = 0和CONTAINS短路,那么
点数。
在实践中,我可能会创建一个新的类属性,然后使用它来忽略我的ORM中的全文索引,但我很想知道是否还有其他选项。
答案 0 :(得分:0)
没有
所有单个查询都编译为单个计划,因此所有单个组件必须始终有效。在不同的情况下,不可能编写一个不同组件有效的单个语句。
这样做需要更传统的程序结构。这些在T-SQL中可用,但不在单个SQL语句中。因此,您列为不合适的解决方案实际上是解决此类问题的方法。