2012-01-30 15 views
1

如果不使用动态SQL,而不是使用IfELSE有什么方法可以测试一个表是否具有全文索引而不会导致额外的锁定。在没有全文索引的表上使用CONTAINS进行查询

我正在寻找一些方法,我仍然可以执行:

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 表或索引视图上的谓词'Cars',因为它不是全文索引 。

有没有办法做到这一点没有动态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 2012-01-30 11:54:35

+0

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

相关问题